Embed gitlab-labkit
This commit is contained in:
parent
2a3f5104a2
commit
f7f86f622a
32 changed files with 1082 additions and 0 deletions
3
debian/gems-compat/gitlab-labkit-0.2.0/.gitignore
vendored
Normal file
3
debian/gems-compat/gitlab-labkit-0.2.0/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Gemfile.lock
|
||||||
|
*.gem
|
||||||
|
node_modules
|
24
debian/gems-compat/gitlab-labkit-0.2.0/.gitlab-ci.yml
vendored
Normal file
24
debian/gems-compat/gitlab-labkit-0.2.0/.gitlab-ci.yml
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
.test_template: &test_definition
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- bundle install
|
||||||
|
- bundle exec rake verify build install
|
||||||
|
|
||||||
|
test:2.6:
|
||||||
|
image: ruby:2.6
|
||||||
|
<<: *test_definition
|
||||||
|
|
||||||
|
test:2.5:
|
||||||
|
image: ruby:2.5
|
||||||
|
<<: *test_definition
|
||||||
|
|
||||||
|
test:2.4:
|
||||||
|
image: ruby:2.4
|
||||||
|
<<: *test_definition
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
stage: deploy
|
||||||
|
script:
|
||||||
|
- tools/deploy-rubygem.sh
|
||||||
|
only:
|
||||||
|
- tags
|
2
debian/gems-compat/gitlab-labkit-0.2.0/.rspec
vendored
Normal file
2
debian/gems-compat/gitlab-labkit-0.2.0/.rspec
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
--color
|
||||||
|
--require ./spec/spec_helper
|
173
debian/gems-compat/gitlab-labkit-0.2.0/.rubocop.yml
vendored
Normal file
173
debian/gems-compat/gitlab-labkit-0.2.0/.rubocop.yml
vendored
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
AllCops:
|
||||||
|
TargetRubyVersion: 2.4
|
||||||
|
|
||||||
|
require:
|
||||||
|
- rubocop-rspec
|
||||||
|
|
||||||
|
Style/HashSyntax:
|
||||||
|
EnforcedStyle: no_mixed_keys
|
||||||
|
|
||||||
|
Style/SymbolLiteral:
|
||||||
|
Enabled: No
|
||||||
|
|
||||||
|
Style/TrailingCommaInArguments:
|
||||||
|
Enabled: No # Delegated to rufo
|
||||||
|
|
||||||
|
Style/TrailingCommaInHashLiteral:
|
||||||
|
Enabled: No # Delegated to rufo
|
||||||
|
|
||||||
|
Style/FrozenStringLiteralComment:
|
||||||
|
EnforcedStyle: always
|
||||||
|
|
||||||
|
Style/TrailingCommaInArrayLiteral:
|
||||||
|
EnforcedStyleForMultiline: comma
|
||||||
|
|
||||||
|
Style/StringLiterals:
|
||||||
|
EnforcedStyle: double_quotes
|
||||||
|
|
||||||
|
Style/StringLiteralsInInterpolation:
|
||||||
|
EnforcedStyle: double_quotes
|
||||||
|
|
||||||
|
Layout/MultilineMethodCallIndentation:
|
||||||
|
Enabled: No
|
||||||
|
|
||||||
|
Layout/SpaceInLambdaLiteral:
|
||||||
|
Enabled: No
|
||||||
|
|
||||||
|
Layout/SpaceInsideBlockBraces:
|
||||||
|
Enabled: No
|
||||||
|
|
||||||
|
Layout/FirstParameterIndentation:
|
||||||
|
Enabled: No
|
||||||
|
|
||||||
|
Metrics/AbcSize:
|
||||||
|
Enabled: true
|
||||||
|
Max: 54.28
|
||||||
|
|
||||||
|
Metrics/BlockLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Metrics/BlockNesting:
|
||||||
|
Enabled: true
|
||||||
|
Max: 4
|
||||||
|
|
||||||
|
Metrics/ClassLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Metrics/CyclomaticComplexity:
|
||||||
|
Enabled: true
|
||||||
|
Max: 13
|
||||||
|
|
||||||
|
Metrics/LineLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Metrics/MethodLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Metrics/ModuleLength:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Metrics/ParameterLists:
|
||||||
|
Enabled: true
|
||||||
|
Max: 8
|
||||||
|
|
||||||
|
Metrics/PerceivedComplexity:
|
||||||
|
Enabled: true
|
||||||
|
Max: 14
|
||||||
|
|
||||||
|
RSpec/AnyInstance:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/BeEql:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
RSpec/BeforeAfterAll:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/DescribeClass:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/DescribeMethod:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/DescribeSymbol:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
RSpec/DescribedClass:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
RSpec/EmptyExampleGroup:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
RSpec/ExampleLength:
|
||||||
|
Enabled: false
|
||||||
|
Max: 5
|
||||||
|
|
||||||
|
RSpec/ExampleWording:
|
||||||
|
Enabled: false
|
||||||
|
CustomTransform:
|
||||||
|
be: is
|
||||||
|
have: has
|
||||||
|
not: does not
|
||||||
|
IgnoredWords: []
|
||||||
|
|
||||||
|
RSpec/ExpectActual:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
RSpec/ExpectOutput:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
RSpec/FilePath:
|
||||||
|
Enabled: true
|
||||||
|
IgnoreMethods: true
|
||||||
|
|
||||||
|
RSpec/Focus:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
RSpec/HookArgument:
|
||||||
|
Enabled: true
|
||||||
|
EnforcedStyle: implicit
|
||||||
|
|
||||||
|
RSpec/ImplicitExpect:
|
||||||
|
Enabled: true
|
||||||
|
EnforcedStyle: is_expected
|
||||||
|
|
||||||
|
RSpec/InstanceVariable:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/LeadingSubject:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/LetSetup:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/MessageChain:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/MessageSpies:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/MultipleDescribes:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/MultipleExpectations:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/NamedSubject:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/NestedGroups:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/NotToNot:
|
||||||
|
EnforcedStyle: not_to
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
RSpec/RepeatedDescription:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/SubjectStub:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/VerifiedDoubles:
|
||||||
|
Enabled: false
|
1
debian/gems-compat/gitlab-labkit-0.2.0/.ruby-version
vendored
Normal file
1
debian/gems-compat/gitlab-labkit-0.2.0/.ruby-version
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ruby-2.5.3
|
3
debian/gems-compat/gitlab-labkit-0.2.0/.rufo
vendored
Normal file
3
debian/gems-compat/gitlab-labkit-0.2.0/.rufo
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
align_chained_calls true
|
||||||
|
parens_in_def :dynamic
|
||||||
|
trailing_commas true
|
5
debian/gems-compat/gitlab-labkit-0.2.0/Gemfile
vendored
Normal file
5
debian/gems-compat/gitlab-labkit-0.2.0/Gemfile
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
gemspec
|
21
debian/gems-compat/gitlab-labkit-0.2.0/LICENSE
vendored
Normal file
21
debian/gems-compat/gitlab-labkit-0.2.0/LICENSE
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016-2019 GitLab B.V.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
39
debian/gems-compat/gitlab-labkit-0.2.0/README.md
vendored
Normal file
39
debian/gems-compat/gitlab-labkit-0.2.0/README.md
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# LabKit-Ruby 🔬🔬🔬🔬🔬
|
||||||
|
|
||||||
|
LabKit-Ruby is minimalist library to provide functionality for Ruby services at GitLab.
|
||||||
|
|
||||||
|
LabKit-Ruby is the Ruby companion for [LabKit](https://gitlab.com/gitlab-org/labkit), a minimalist library to provide functionality for Go services at GitLab.
|
||||||
|
|
||||||
|
LabKit-Ruby and LabKit are intended to provide similar functionality, but use the semantics of their respective languages, so are not intended to provide identical APIS.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
API Documentation is available at [the Rubydoc site](https://www.rubydoc.info/gems/gitlab-labkit/).
|
||||||
|
|
||||||
|
## Functionality
|
||||||
|
|
||||||
|
LabKit-Ruby provides functionality in three areas:
|
||||||
|
|
||||||
|
1. `Labkit::Correlation` for handling and propagating Correlation-IDs.
|
||||||
|
1. `Labkit::Logging` for sanitizing log messages.
|
||||||
|
1. `Labkit::Tracing` for handling and propagating distributed traces.
|
||||||
|
|
||||||
|
## Developing
|
||||||
|
|
||||||
|
Anyone can contribute!
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ git clone git@gitlab.com:gitlab-org/labkit-ruby.git
|
||||||
|
$ cd labkit-ruby
|
||||||
|
$ bundle install
|
||||||
|
|
||||||
|
$ # Autoformat code and auto-correct linters
|
||||||
|
$ bundle exec rake fix
|
||||||
|
|
||||||
|
$ # Run tests, linters
|
||||||
|
$ bundle exec rake verify
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that LabKit-Ruby uses the [`rufo`](https://github.com/ruby-formatter/rufo) for auto-formatting. Please run `bundle exec rake fix` to auto-format your code before pushing.
|
||||||
|
|
||||||
|
Please also review the [development section of the LabKit (go) README](https://gitlab.com/gitlab-org/labkit#developing-labkit) for details of the LabKit architectural philosophy.
|
41
debian/gems-compat/gitlab-labkit-0.2.0/Rakefile
vendored
Normal file
41
debian/gems-compat/gitlab-labkit-0.2.0/Rakefile
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "bundler/gem_tasks"
|
||||||
|
require "rufo"
|
||||||
|
|
||||||
|
begin
|
||||||
|
require "rspec/core/rake_task"
|
||||||
|
RSpec::Core::RakeTask.new(:spec)
|
||||||
|
end
|
||||||
|
|
||||||
|
require "rubocop/rake_task"
|
||||||
|
RuboCop::RakeTask.new
|
||||||
|
|
||||||
|
desc "Alias for `rake rufo:run`"
|
||||||
|
task :format => ["rufo:run"]
|
||||||
|
|
||||||
|
namespace :rufo do
|
||||||
|
require "rufo"
|
||||||
|
|
||||||
|
def rufo_command(*switches, rake_args)
|
||||||
|
files_or_dirs = rake_args[:files_or_dirs] || "."
|
||||||
|
args = switches + files_or_dirs.split(" ")
|
||||||
|
Rufo::Command.run(args)
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Format Ruby code in current directory"
|
||||||
|
task :run, [:files_or_dirs] do |_task, rake_args|
|
||||||
|
rufo_command(rake_args)
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Check that no formatting changes are produced"
|
||||||
|
task :check, [:files_or_dirs] do |_task, rake_args|
|
||||||
|
rufo_command("--check", rake_args)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
task :fix => %w[rufo:run rubocop:auto_correct]
|
||||||
|
|
||||||
|
task :verify => %w[spec rufo:check rubocop]
|
||||||
|
|
||||||
|
task :default => %w[verify build]
|
33
debian/gems-compat/gitlab-labkit-0.2.0/gitlab-labkit.gemspec
vendored
Normal file
33
debian/gems-compat/gitlab-labkit-0.2.0/gitlab-labkit.gemspec
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
lib = File.expand_path("lib", __dir__)
|
||||||
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
||||||
|
|
||||||
|
Gem::Specification.new do |spec|
|
||||||
|
spec.name = "gitlab-labkit"
|
||||||
|
spec.version = "0.2.0"
|
||||||
|
spec.authors = ["Andrew Newdigate"]
|
||||||
|
spec.email = ["andrew@gitlab.com"]
|
||||||
|
|
||||||
|
spec.summary = "Instrumentation for GitLab"
|
||||||
|
spec.homepage = "http://about.gitlab.com"
|
||||||
|
spec.license = "MIT"
|
||||||
|
|
||||||
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|tools)/}) }
|
||||||
|
spec.require_paths = ["lib"]
|
||||||
|
spec.required_ruby_version = ">= 2.4.0"
|
||||||
|
|
||||||
|
spec.add_runtime_dependency "actionpack", "~> 5"
|
||||||
|
spec.add_runtime_dependency "activesupport", "~> 5"
|
||||||
|
spec.add_runtime_dependency "grpc", "~> 1.15"
|
||||||
|
spec.add_runtime_dependency "jaeger-client", "~> 0.10"
|
||||||
|
spec.add_runtime_dependency "opentracing", "~> 0.4"
|
||||||
|
|
||||||
|
spec.add_development_dependency "rack", "~> 2.0"
|
||||||
|
spec.add_development_dependency "rake", "~> 12.3"
|
||||||
|
spec.add_development_dependency "rspec", "~> 3.6.0"
|
||||||
|
spec.add_development_dependency "rspec-parameterized", "~> 0.4"
|
||||||
|
spec.add_development_dependency "rubocop", "~> 0.65.0"
|
||||||
|
spec.add_development_dependency "rubocop-rspec", "~> 1.22.1"
|
||||||
|
spec.add_development_dependency "rufo", "~> 0.6"
|
||||||
|
end
|
15
debian/gems-compat/gitlab-labkit-0.2.0/lib/gitlab-labkit.rb
vendored
Normal file
15
debian/gems-compat/gitlab-labkit-0.2.0/lib/gitlab-labkit.rb
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# rubocop:disable Naming/FileName
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "active_support/all"
|
||||||
|
|
||||||
|
# LabKit is a module for handling cross-project
|
||||||
|
# infrastructural concerns, partcularly related to
|
||||||
|
# observability.
|
||||||
|
module Labkit
|
||||||
|
autoload :Correlation, "labkit/correlation"
|
||||||
|
autoload :Tracing, "labkit/tracing"
|
||||||
|
autoload :Logging, "labkit/logging"
|
||||||
|
end
|
||||||
|
|
||||||
|
# rubocop:enable Naming/FileName
|
8
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/correlation.rb
vendored
Normal file
8
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/correlation.rb
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
# Correlation provides correlation functionality
|
||||||
|
module Correlation
|
||||||
|
autoload :CorrelationId, "labkit/correlation/correlation_id"
|
||||||
|
end
|
||||||
|
end
|
44
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/correlation/correlation_id.rb
vendored
Normal file
44
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/correlation/correlation_id.rb
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Correlation
|
||||||
|
# CorrelationId module provides access the Correlation-ID
|
||||||
|
# of the current request
|
||||||
|
module CorrelationId
|
||||||
|
LOG_KEY = "correlation_id"
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def use_id(correlation_id, &_blk)
|
||||||
|
# always generate a id if null is passed
|
||||||
|
correlation_id ||= new_id
|
||||||
|
|
||||||
|
ids.push(correlation_id || new_id)
|
||||||
|
|
||||||
|
begin
|
||||||
|
yield(current_id)
|
||||||
|
ensure
|
||||||
|
ids.pop
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_id
|
||||||
|
ids.last
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_or_new_id
|
||||||
|
current_id || new_id
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def ids
|
||||||
|
Thread.current[:correlation_id] ||= []
|
||||||
|
end
|
||||||
|
|
||||||
|
def new_id
|
||||||
|
SecureRandom.uuid
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
9
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/logging.rb
vendored
Normal file
9
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/logging.rb
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
# Logging provides functionality for logging, such as
|
||||||
|
# sanitization
|
||||||
|
module Logging
|
||||||
|
autoload :Sanitizer, "labkit/logging/sanitizer"
|
||||||
|
end
|
||||||
|
end
|
54
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/logging/sanitizer.rb
vendored
Normal file
54
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/logging/sanitizer.rb
vendored
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Logging
|
||||||
|
# Sanitizer provides log message sanitization, removing
|
||||||
|
# confidential information from log messages
|
||||||
|
class Sanitizer
|
||||||
|
SCP_URL_REGEXP = %r{
|
||||||
|
(?:((?:[\-_.!~*()a-zA-Z\d;&=+$,]|%[a-fA-F\d]{2})+)(:(?:(?:[\-_.!~*()a-zA-Z\d;:&=+$,]|%[a-fA-F\d]{2})*))?@) (?# 1: username, 2: password)
|
||||||
|
(?:((?:(?:[a-zA-Z0-9\-._])+|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\[(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?:(?:[a-fA-F\d]{1,4}:)*[a-fA-F\d]{1,4})?::(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))?)\]))) (?# 3: host)
|
||||||
|
:
|
||||||
|
((?:[\-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*(?:;(?:[\-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*)*(?:\/(?:[\-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*(?:;(?:[\-_.!~*'()a-zA-Z\d:@&=+$,]|%[a-fA-F\d]{2})*)*)*)? (?# 4: path)
|
||||||
|
}x.freeze
|
||||||
|
SCP_ANCHORED_URL_REGEXP = /^#{SCP_URL_REGEXP}$/x.freeze
|
||||||
|
ALLOWED_SCHEMES = %w[http https ssh git].freeze
|
||||||
|
URL_REGEXP = URI::DEFAULT_PARSER.make_regexp(ALLOWED_SCHEMES).freeze
|
||||||
|
|
||||||
|
def self.sanitize_field(content)
|
||||||
|
content = content.gsub(URL_REGEXP) { |url| mask_url(url) }
|
||||||
|
content = content.gsub(SCP_URL_REGEXP) { |scp_url| mask_scp_url(scp_url) }
|
||||||
|
|
||||||
|
content
|
||||||
|
end
|
||||||
|
|
||||||
|
# Ensures that URLS are sanitized to hide credentials
|
||||||
|
def self.mask_url(url)
|
||||||
|
url = url.to_s.strip
|
||||||
|
p = URI::DEFAULT_PARSER.parse(url)
|
||||||
|
|
||||||
|
p.password = "*****" if p.password.present?
|
||||||
|
p.user = "*****" if p.user.present?
|
||||||
|
p.to_s
|
||||||
|
rescue URI::InvalidURIError
|
||||||
|
""
|
||||||
|
end
|
||||||
|
|
||||||
|
# Ensures that URLs of the form user:password@hostname:project.git are
|
||||||
|
# sanitized to hide credentials
|
||||||
|
def self.mask_scp_url(scp_url)
|
||||||
|
scp_url = scp_url.to_s.strip
|
||||||
|
m = SCP_ANCHORED_URL_REGEXP.match(scp_url)
|
||||||
|
return "" unless m
|
||||||
|
|
||||||
|
password = m[2]
|
||||||
|
host = m[3]
|
||||||
|
path = m[4]
|
||||||
|
|
||||||
|
return "*****@#{host}:#{path}" unless password.present?
|
||||||
|
|
||||||
|
"*****:*****@#{host}:#{path}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
57
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing.rb
vendored
Normal file
57
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing.rb
vendored
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "active_support/all"
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
# Tracing provides distributed tracing functionality
|
||||||
|
module Tracing
|
||||||
|
autoload :Factory, "labkit/tracing/factory"
|
||||||
|
autoload :GRPCInterceptor, "labkit/tracing/grpc_interceptor"
|
||||||
|
autoload :JaegerFactory, "labkit/tracing/jaeger_factory"
|
||||||
|
autoload :RackMiddleware, "labkit/tracing/rack_middleware"
|
||||||
|
autoload :Rails, "labkit/tracing/rails"
|
||||||
|
autoload :Sidekiq, "labkit/tracing/sidekiq"
|
||||||
|
autoload :TracingUtils, "labkit/tracing/tracing_utils"
|
||||||
|
|
||||||
|
# Tracing is only enabled when the `GITLAB_TRACING` env var is configured.
|
||||||
|
def self.enabled?
|
||||||
|
connection_string.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.connection_string
|
||||||
|
ENV["GITLAB_TRACING"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.tracing_url_template
|
||||||
|
ENV["GITLAB_TRACING_URL"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.tracing_url_enabled?
|
||||||
|
enabled? && tracing_url_template.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
# This will provide a link into the distributed tracing for the current trace,
|
||||||
|
# if it has been captured.
|
||||||
|
def self.tracing_url(service_name)
|
||||||
|
return unless tracing_url_enabled?
|
||||||
|
|
||||||
|
correlation_id = Labkit::Correlation::CorrelationId.current_id.to_s
|
||||||
|
|
||||||
|
# Avoid using `format` since it can throw TypeErrors
|
||||||
|
# which we want to avoid on unsanitised env var input
|
||||||
|
tracing_url_template.to_s
|
||||||
|
.gsub("{{ correlation_id }}", correlation_id)
|
||||||
|
.gsub("{{ service }}", service_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
# This will run a block with a span
|
||||||
|
# @param operation_name [String] The operation name for the span
|
||||||
|
# @param tags [Hash] Tags to assign to the span
|
||||||
|
# @param child_of [SpanContext, Span] SpanContext that acts as a parent to
|
||||||
|
# the newly-started span. If a span instance is provided, its
|
||||||
|
# context is automatically substituted.
|
||||||
|
def self.with_tracing(**kwargs, &block)
|
||||||
|
TracingUtils.with_tracing(**kwargs, &block)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
58
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/factory.rb
vendored
Normal file
58
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/factory.rb
vendored
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "cgi"
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
# Factory provides tools for setting up and configuring the
|
||||||
|
# distributed tracing system within the process, given the
|
||||||
|
# tracing connection string
|
||||||
|
class Factory
|
||||||
|
OPENTRACING_SCHEME = "opentracing"
|
||||||
|
|
||||||
|
def self.create_tracer(service_name, connection_string)
|
||||||
|
return unless connection_string.present?
|
||||||
|
|
||||||
|
begin
|
||||||
|
opentracing_details = parse_connection_string(connection_string)
|
||||||
|
driver_name = opentracing_details[:driver_name]
|
||||||
|
|
||||||
|
case driver_name
|
||||||
|
when "jaeger"
|
||||||
|
JaegerFactory.create_tracer(service_name, opentracing_details[:options])
|
||||||
|
else
|
||||||
|
raise "Unknown driver: #{driver_name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Can't create the tracer? Warn and continue sans tracer
|
||||||
|
rescue StandardError => e
|
||||||
|
warn "Unable to instantiate tracer: #{e}"
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.parse_connection_string(connection_string)
|
||||||
|
parsed = URI.parse(connection_string)
|
||||||
|
|
||||||
|
raise "Invalid tracing connection string" unless valid_uri?(parsed)
|
||||||
|
|
||||||
|
{ driver_name: parsed.host, options: parse_query(parsed.query) }
|
||||||
|
end
|
||||||
|
private_class_method :parse_connection_string
|
||||||
|
|
||||||
|
def self.parse_query(query)
|
||||||
|
return {} unless query
|
||||||
|
|
||||||
|
CGI.parse(query).symbolize_keys.transform_values(&:first)
|
||||||
|
end
|
||||||
|
private_class_method :parse_query
|
||||||
|
|
||||||
|
def self.valid_uri?(uri)
|
||||||
|
return false unless uri
|
||||||
|
|
||||||
|
uri.scheme == OPENTRACING_SCHEME && uri.host.to_s =~ /^[a-z0-9_]+$/ && uri.path.empty?
|
||||||
|
end
|
||||||
|
private_class_method :valid_uri?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
45
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/grpc_interceptor.rb
vendored
Normal file
45
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/grpc_interceptor.rb
vendored
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# rubocop:disable Lint/UnusedMethodArgument
|
||||||
|
require "opentracing"
|
||||||
|
require "grpc"
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
# GRPCInterceptor is a client-side GRPC interceptor
|
||||||
|
# for instrumenting GRPC calls with distributed tracing
|
||||||
|
class GRPCInterceptor < GRPC::ClientInterceptor
|
||||||
|
include Singleton
|
||||||
|
|
||||||
|
def request_response(request:, call:, method:, metadata:)
|
||||||
|
wrap_with_tracing(method, "unary", metadata) { yield }
|
||||||
|
end
|
||||||
|
|
||||||
|
def client_streamer(requests:, call:, method:, metadata:)
|
||||||
|
wrap_with_tracing(method, "client_stream", metadata) { yield }
|
||||||
|
end
|
||||||
|
|
||||||
|
def server_streamer(request:, call:, method:, metadata:)
|
||||||
|
wrap_with_tracing(method, "server_stream", metadata) { yield }
|
||||||
|
end
|
||||||
|
|
||||||
|
def bidi_streamer(requests:, call:, method:, metadata:)
|
||||||
|
wrap_with_tracing(method, "bidi_stream", metadata) { yield }
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def wrap_with_tracing(method, grpc_type, metadata)
|
||||||
|
tags = { "component" => "grpc", "span.kind" => "client", "grpc.method" => method, "grpc.type" => grpc_type }
|
||||||
|
|
||||||
|
TracingUtils.with_tracing(operation_name: "grpc:#{method}", tags: tags) do |span|
|
||||||
|
OpenTracing.inject(span.context, OpenTracing::FORMAT_TEXT_MAP, metadata)
|
||||||
|
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# rubocop:enable Lint/UnusedMethodArgument
|
82
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/jaeger_factory.rb
vendored
Normal file
82
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/jaeger_factory.rb
vendored
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "jaeger/client"
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
# JaegerFactory will configure Jaeger distributed tracing
|
||||||
|
class JaegerFactory
|
||||||
|
# When the probabilistic sampler is used, by default 0.1% of requests will be traced
|
||||||
|
DEFAULT_PROBABILISTIC_RATE = 0.001
|
||||||
|
|
||||||
|
# The default port for the Jaeger agent UDP listener
|
||||||
|
DEFAULT_UDP_PORT = 6831
|
||||||
|
|
||||||
|
# Reduce this from default of 10 seconds as the Ruby jaeger
|
||||||
|
# client doesn't have overflow control, leading to very large
|
||||||
|
# messages which fail to send over UDP (max packet = 64k)
|
||||||
|
# Flush more often, with smaller packets
|
||||||
|
FLUSH_INTERVAL = 5
|
||||||
|
|
||||||
|
def self.create_tracer(service_name, options)
|
||||||
|
kwargs = {
|
||||||
|
service_name: service_name,
|
||||||
|
sampler: get_sampler(options[:sampler], options[:sampler_param]),
|
||||||
|
reporter: get_reporter(service_name, options[:http_endpoint], options[:udp_endpoint]),
|
||||||
|
}.compact
|
||||||
|
|
||||||
|
extra_params = options.except(:sampler, :sampler_param, :http_endpoint, :udp_endpoint, :strict_parsing, :debug)
|
||||||
|
if extra_params.present?
|
||||||
|
message = "jaeger tracer: invalid option: #{extra_params.keys.join(", ")}"
|
||||||
|
|
||||||
|
raise message if options[:strict_parsing]
|
||||||
|
|
||||||
|
warn message
|
||||||
|
end
|
||||||
|
|
||||||
|
Jaeger::Client.build(kwargs)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.get_sampler(sampler_type, sampler_param)
|
||||||
|
case sampler_type
|
||||||
|
when "probabilistic"
|
||||||
|
sampler_rate = sampler_param ? sampler_param.to_f : DEFAULT_PROBABILISTIC_RATE
|
||||||
|
Jaeger::Samplers::Probabilistic.new(rate: sampler_rate)
|
||||||
|
when "const"
|
||||||
|
const_value = sampler_param == "1"
|
||||||
|
Jaeger::Samplers::Const.new(const_value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
private_class_method :get_sampler
|
||||||
|
|
||||||
|
def self.get_reporter(service_name, http_endpoint, udp_endpoint)
|
||||||
|
encoder = Jaeger::Encoders::ThriftEncoder.new(service_name: service_name)
|
||||||
|
|
||||||
|
if http_endpoint.present?
|
||||||
|
sender = get_http_sender(encoder, http_endpoint)
|
||||||
|
elsif udp_endpoint.present?
|
||||||
|
sender = get_udp_sender(encoder, udp_endpoint)
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
Jaeger::Reporters::RemoteReporter.new(sender: sender, flush_interval: FLUSH_INTERVAL)
|
||||||
|
end
|
||||||
|
private_class_method :get_reporter
|
||||||
|
|
||||||
|
def self.get_http_sender(encoder, address)
|
||||||
|
Jaeger::HttpSender.new(url: address, encoder: encoder, logger: Logger.new(STDOUT))
|
||||||
|
end
|
||||||
|
private_class_method :get_http_sender
|
||||||
|
|
||||||
|
def self.get_udp_sender(encoder, address)
|
||||||
|
pair = address.split(":", 2)
|
||||||
|
host = pair[0]
|
||||||
|
port = pair[1] ? pair[1].to_i : DEFAULT_UDP_PORT
|
||||||
|
|
||||||
|
Jaeger::UdpSender.new(host: host, port: port, encoder: encoder, logger: Logger.new(STDOUT))
|
||||||
|
end
|
||||||
|
private_class_method :get_udp_sender
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
42
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rack_middleware.rb
vendored
Normal file
42
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rack_middleware.rb
vendored
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "opentracing"
|
||||||
|
require "active_support/all"
|
||||||
|
require "action_dispatch"
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
# RackMiddleware is a rack middleware component for
|
||||||
|
# instrumenting incoming http requests into a Rails/Rack
|
||||||
|
# server
|
||||||
|
class RackMiddleware
|
||||||
|
REQUEST_METHOD = "REQUEST_METHOD"
|
||||||
|
|
||||||
|
def initialize(app)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
method = env[REQUEST_METHOD]
|
||||||
|
|
||||||
|
context = TracingUtils.tracer.extract(OpenTracing::FORMAT_RACK, env)
|
||||||
|
tags = { "component" => "rack", "span.kind" => "server", "http.method" => method, "http.url" => self.class.build_sanitized_url_from_env(env) }
|
||||||
|
|
||||||
|
TracingUtils.with_tracing(operation_name: "http:#{method}", child_of: context, tags: tags) do |span|
|
||||||
|
@app.call(env).tap { |status_code, _headers, _body| span.set_tag("http.status_code", status_code) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Generate a sanitized (safe) request URL from the rack environment
|
||||||
|
def self.build_sanitized_url_from_env(env)
|
||||||
|
request = ::ActionDispatch::Request.new(env)
|
||||||
|
|
||||||
|
original_url = request.original_url
|
||||||
|
uri = URI.parse(original_url)
|
||||||
|
uri.query = request.filtered_parameters.to_query if uri.query.present?
|
||||||
|
|
||||||
|
uri.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
12
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rails.rb
vendored
Normal file
12
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rails.rb
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
# Rails provides classes for instrumenting Rails events
|
||||||
|
module Rails
|
||||||
|
autoload :ActionViewSubscriber, "labkit/tracing/rails/action_view_subscriber"
|
||||||
|
autoload :ActiveRecordSubscriber, "labkit/tracing/rails/active_record_subscriber"
|
||||||
|
autoload :RailsCommon, "labkit/tracing/rails/rails_common"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
70
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rails/action_view_subscriber.rb
vendored
Normal file
70
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rails/action_view_subscriber.rb
vendored
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
module Rails
|
||||||
|
# ActionViewSubscriber bridges action view notifications to
|
||||||
|
# the distributed tracing subsystem
|
||||||
|
class ActionViewSubscriber
|
||||||
|
include RailsCommon
|
||||||
|
|
||||||
|
COMPONENT_TAG = "ActionView"
|
||||||
|
RENDER_TEMPLATE_NOTIFICATION_TOPIC = "render_template.action_view"
|
||||||
|
RENDER_COLLECTION_NOTIFICATION_TOPIC = "render_collection.action_view"
|
||||||
|
RENDER_PARTIAL_NOTIFICATION_TOPIC = "render_partial.action_view"
|
||||||
|
|
||||||
|
# Instruments Rails ActionView events for opentracing.
|
||||||
|
# Returns a lambda, which, when called will unsubscribe from the notifications
|
||||||
|
def self.instrument
|
||||||
|
subscriber = new
|
||||||
|
|
||||||
|
subscriptions = [
|
||||||
|
ActiveSupport::Notifications.subscribe(RENDER_TEMPLATE_NOTIFICATION_TOPIC) do |_, start, finish, _, payload|
|
||||||
|
subscriber.notify_render_template(start, finish, payload)
|
||||||
|
end,
|
||||||
|
ActiveSupport::Notifications.subscribe(RENDER_COLLECTION_NOTIFICATION_TOPIC) do |_, start, finish, _, payload|
|
||||||
|
subscriber.notify_render_collection(start, finish, payload)
|
||||||
|
end,
|
||||||
|
ActiveSupport::Notifications.subscribe(RENDER_PARTIAL_NOTIFICATION_TOPIC) do |_, start, finish, _, payload|
|
||||||
|
subscriber.notify_render_partial(start, finish, payload)
|
||||||
|
end,
|
||||||
|
]
|
||||||
|
|
||||||
|
create_unsubscriber subscriptions
|
||||||
|
end
|
||||||
|
|
||||||
|
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
||||||
|
def notify_render_template(start, finish, payload)
|
||||||
|
generate_span_for_notification("render_template", start, finish, payload, tags_for_render_template(payload))
|
||||||
|
end
|
||||||
|
|
||||||
|
def notify_render_collection(start, finish, payload)
|
||||||
|
generate_span_for_notification("render_collection", start, finish, payload, tags_for_render_collection(payload))
|
||||||
|
end
|
||||||
|
|
||||||
|
def notify_render_partial(start, finish, payload)
|
||||||
|
generate_span_for_notification("render_partial", start, finish, payload, tags_for_render_partial(payload))
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def tags_for_render_template(payload)
|
||||||
|
{ "component" => COMPONENT_TAG, "template.id" => payload[:identifier], "template.layout" => payload[:layout] }
|
||||||
|
end
|
||||||
|
|
||||||
|
def tags_for_render_collection(payload)
|
||||||
|
{
|
||||||
|
"component" => COMPONENT_TAG,
|
||||||
|
"template.id" => payload[:identifier],
|
||||||
|
"template.count" => payload[:count] || 0,
|
||||||
|
"template.cache.hits" => payload[:cache_hits] || 0,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def tags_for_render_partial(payload)
|
||||||
|
{ "component" => COMPONENT_TAG, "template.id" => payload[:identifier] }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
52
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rails/active_record_subscriber.rb
vendored
Normal file
52
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rails/active_record_subscriber.rb
vendored
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
module Rails
|
||||||
|
# ActiveRecordSubscriber bridges active record notifications to
|
||||||
|
# the distributed tracing subsystem
|
||||||
|
class ActiveRecordSubscriber
|
||||||
|
include RailsCommon
|
||||||
|
|
||||||
|
ACTIVE_RECORD_NOTIFICATION_TOPIC = "sql.active_record"
|
||||||
|
OPERATION_NAME_PREFIX = "active_record:"
|
||||||
|
DEFAULT_OPERATION_NAME = "sqlquery"
|
||||||
|
|
||||||
|
# Instruments Rails ActiveRecord events for opentracing.
|
||||||
|
# Returns a lambda, which, when called will unsubscribe from the notifications
|
||||||
|
def self.instrument
|
||||||
|
subscriber = new
|
||||||
|
|
||||||
|
subscription =
|
||||||
|
ActiveSupport::Notifications.subscribe(ACTIVE_RECORD_NOTIFICATION_TOPIC) do |_, start, finish, _, payload|
|
||||||
|
subscriber.notify(start, finish, payload)
|
||||||
|
end
|
||||||
|
|
||||||
|
create_unsubscriber [subscription]
|
||||||
|
end
|
||||||
|
|
||||||
|
# For more information on the payloads: https://guides.rubyonrails.org/active_support_instrumentation.html
|
||||||
|
def notify(start, finish, payload)
|
||||||
|
generate_span_for_notification(notification_name(payload), start, finish, payload, tags_for_notification(payload))
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def notification_name(payload)
|
||||||
|
OPERATION_NAME_PREFIX + (payload[:name].presence || DEFAULT_OPERATION_NAME)
|
||||||
|
end
|
||||||
|
|
||||||
|
def tags_for_notification(payload)
|
||||||
|
{
|
||||||
|
"component" => "ActiveRecord",
|
||||||
|
"span.kind" => "client",
|
||||||
|
"db.type" => "sql",
|
||||||
|
"db.connection_id" => payload[:connection_id],
|
||||||
|
"db.cached" => payload[:cached] || false,
|
||||||
|
"db.statement" => payload[:sql],
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
27
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rails/rails_common.rb
vendored
Normal file
27
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/rails/rails_common.rb
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "active_support/all"
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
module Rails
|
||||||
|
# RailsCommon is a mixin for providing instrumentation
|
||||||
|
# functionality for the rails instrumentation classes
|
||||||
|
module RailsCommon
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
class_methods do
|
||||||
|
def create_unsubscriber(subscriptions)
|
||||||
|
-> { subscriptions.each { |subscriber| ActiveSupport::Notifications.unsubscribe(subscriber) } }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_span_for_notification(operation_name, start, finish, payload, tags)
|
||||||
|
exception = payload[:exception]
|
||||||
|
|
||||||
|
TracingUtils.postnotify_span(operation_name, start, finish, tags: tags, exception: exception)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
13
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/sidekiq.rb
vendored
Normal file
13
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/sidekiq.rb
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
# Sidekiq provides classes for instrumenting Sidekiq client and server
|
||||||
|
# functionality
|
||||||
|
module Sidekiq
|
||||||
|
autoload :ClientMiddleware, "labkit/tracing/sidekiq/client_middleware"
|
||||||
|
autoload :ServerMiddleware, "labkit/tracing/sidekiq/server_middleware"
|
||||||
|
autoload :SidekiqCommon, "labkit/tracing/sidekiq/sidekiq_common"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
27
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/sidekiq/client_middleware.rb
vendored
Normal file
27
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/sidekiq/client_middleware.rb
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "opentracing"
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
module Sidekiq
|
||||||
|
# ClientMiddleware provides a sidekiq client middleware for
|
||||||
|
# instrumenting distributed tracing calls made from the client
|
||||||
|
# application
|
||||||
|
class ClientMiddleware
|
||||||
|
include SidekiqCommon
|
||||||
|
|
||||||
|
SPAN_KIND = "client"
|
||||||
|
|
||||||
|
def call(_worker_class, job, _queue, _redis_pool)
|
||||||
|
TracingUtils.with_tracing(operation_name: "sidekiq:#{job["class"]}", tags: tags_from_job(job, SPAN_KIND)) do |span|
|
||||||
|
# Inject the details directly into the job
|
||||||
|
TracingUtils.tracer.inject(span.context, OpenTracing::FORMAT_TEXT_MAP, job)
|
||||||
|
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
24
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/sidekiq/server_middleware.rb
vendored
Normal file
24
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/sidekiq/server_middleware.rb
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "opentracing"
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
module Sidekiq
|
||||||
|
# ServerMiddleware provides a sidekiq server middleware for
|
||||||
|
# instrumenting distributed tracing calls when they are
|
||||||
|
# executed by the Sidekiq server
|
||||||
|
class ServerMiddleware
|
||||||
|
include SidekiqCommon
|
||||||
|
|
||||||
|
SPAN_KIND = "server"
|
||||||
|
|
||||||
|
def call(_worker, job, _queue)
|
||||||
|
context = TracingUtils.tracer.extract(OpenTracing::FORMAT_TEXT_MAP, job)
|
||||||
|
|
||||||
|
TracingUtils.with_tracing(operation_name: "sidekiq:#{job["class"]}", child_of: context, tags: tags_from_job(job, SPAN_KIND)) { |_span| yield }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
21
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/sidekiq/sidekiq_common.rb
vendored
Normal file
21
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/sidekiq/sidekiq_common.rb
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
module Sidekiq
|
||||||
|
# SidekiqCommon is a mixin for the sidekiq middleware components
|
||||||
|
module SidekiqCommon
|
||||||
|
def tags_from_job(job, kind)
|
||||||
|
{
|
||||||
|
"component" => "sidekiq",
|
||||||
|
"span.kind" => kind,
|
||||||
|
"sidekiq.queue" => job["queue"],
|
||||||
|
"sidekiq.jid" => job["jid"],
|
||||||
|
"sidekiq.retry" => job["retry"].to_s,
|
||||||
|
"sidekiq.args" => job["args"]&.join(", "),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
65
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/tracing_utils.rb
vendored
Normal file
65
debian/gems-compat/gitlab-labkit-0.2.0/lib/labkit/tracing/tracing_utils.rb
vendored
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "opentracing"
|
||||||
|
|
||||||
|
module Labkit
|
||||||
|
module Tracing
|
||||||
|
# Internal methods for tracing. This is not part of the LabKit public API.
|
||||||
|
# For internal usage only
|
||||||
|
class TracingUtils
|
||||||
|
# Convience method for running a block with a span
|
||||||
|
def self.with_tracing(operation_name:, tags:, child_of: nil)
|
||||||
|
scope = tracer.start_active_span(operation_name, child_of: child_of, tags: tags)
|
||||||
|
span = scope.span
|
||||||
|
|
||||||
|
# Add correlation details to the span if we have them
|
||||||
|
correlation_id = Labkit::Correlation::CorrelationId.current_id
|
||||||
|
span.set_tag("correlation_id", correlation_id) if correlation_id
|
||||||
|
|
||||||
|
begin
|
||||||
|
yield span
|
||||||
|
rescue StandardError => e
|
||||||
|
log_exception_on_span(span, e)
|
||||||
|
raise e
|
||||||
|
ensure
|
||||||
|
scope.close
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Obtain a tracer instance
|
||||||
|
def self.tracer
|
||||||
|
OpenTracing.global_tracer
|
||||||
|
end
|
||||||
|
|
||||||
|
# Generate a span retrospectively
|
||||||
|
def self.postnotify_span(operation_name, start_time, end_time, tags: nil, child_of: nil, exception: nil)
|
||||||
|
span = OpenTracing.start_span(operation_name, start_time: start_time, tags: tags, child_of: child_of)
|
||||||
|
|
||||||
|
log_exception_on_span(span, exception) if exception
|
||||||
|
|
||||||
|
span.finish(end_time: end_time)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Add exception logging to a span
|
||||||
|
def self.log_exception_on_span(span, exception)
|
||||||
|
span.set_tag("error", true)
|
||||||
|
span.log_kv(kv_tags_for_exception(exception))
|
||||||
|
end
|
||||||
|
|
||||||
|
# Generate key-value tags for an exception
|
||||||
|
def self.kv_tags_for_exception(exception)
|
||||||
|
case exception
|
||||||
|
when Exception
|
||||||
|
{
|
||||||
|
:"event" => "error",
|
||||||
|
:"error.kind" => exception.class.to_s,
|
||||||
|
:"message" => Labkit::Logging::Sanitizer.sanitize_field(exception.message),
|
||||||
|
:"stack" => exception.backtrace&.join('\n'),
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ :"event" => "error", :"error.kind" => exception.class.to_s, :"error.object" => Labkit::Logging::Sanitizer.sanitize_field(exception.to_s) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
11
debian/patches/0840-embed-gitlab-labkit.patch
vendored
Normal file
11
debian/patches/0840-embed-gitlab-labkit.patch
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
--- a/Gemfile
|
||||||
|
+++ b/Gemfile
|
||||||
|
@@ -282,7 +282,7 @@
|
||||||
|
gem 'premailer-rails', '~> 1.9', '>= 1.9.7'
|
||||||
|
|
||||||
|
# LabKit: Tracing and Correlation
|
||||||
|
-gem 'gitlab-labkit', '~> 0.2.0'
|
||||||
|
+gem 'gitlab-labkit', '~> 0.2.0', path: 'vendor/gems/gitlab-labkit-0.2.0'
|
||||||
|
|
||||||
|
# I18n
|
||||||
|
gem 'ruby_parser', '~> 3.8', require: false
|
1
debian/patches/series
vendored
1
debian/patches/series
vendored
|
@ -33,3 +33,4 @@ bump-devise-to-4-6.patch
|
||||||
0810-embed-omniauth-salesforce.patch
|
0810-embed-omniauth-salesforce.patch
|
||||||
0820-embed-apollo-upload-server.patch
|
0820-embed-apollo-upload-server.patch
|
||||||
0830-embed-sassc-rails.patch
|
0830-embed-sassc-rails.patch
|
||||||
|
0840-embed-gitlab-labkit.patch
|
||||||
|
|
Loading…
Add table
Reference in a new issue