libddprof 0.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f7d6f24e3511e2560edb611e06fae670921fcbcda86eeaf4475b6432c17d395a
4
+ data.tar.gz: 270084987103083b79fb0ad99bd15b64bfa44351460e0b43ce504ea7d7e94890
5
+ SHA512:
6
+ metadata.gz: 89aa189f92a623a51785c098e4358f97ec8b955e22dc0c008afb6eaf9388cce6559acc9390986252da1fab23058ee47803a15d078b00c68b872dd07bd7253483
7
+ data.tar.gz: d8309cfec327b55f159c13a76e8ff32b18040720a545e6496270472145db54a089506183d362264a07cdc211d31f53ed3af630896411bb5d95d2df22a7fcc058
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.standard.yml ADDED
@@ -0,0 +1,3 @@
1
+ # For available configuration options, see:
2
+ # https://github.com/testdouble/standard
3
+ ruby_version: 2.1
data/Rakefile ADDED
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+ require "standard/rake" unless RUBY_VERSION < "2.5"
6
+
7
+ require "fileutils"
8
+ require "http"
9
+ require "pry"
10
+ require "rubygems/package"
11
+
12
+ RSpec::Core::RakeTask.new(:spec)
13
+
14
+ LIB_GITHUB_RELEASES = {
15
+ "0.2.0" => [
16
+ {
17
+ file: "libddprof-x86_64-unknown-linux-gnu.tar.gz",
18
+ sha256: "cba0f24074d44781d7252b912faff50d330957e84a8f40a172a8138e81001f27",
19
+ ruby_platform: "x86_64-linux"
20
+ },
21
+ {
22
+ file: "libddprof-x86_64-alpine-linux-musl.tar.gz",
23
+ sha256: "d519a6241d78260522624b8e79e98502510f11d5d9551f5f80fc1134e95fa146",
24
+ ruby_platform: "x86_64-linux-musl"
25
+ }
26
+ ]
27
+ # Add more versions here
28
+ }
29
+
30
+ task default: [
31
+ :spec,
32
+ (:'standard:fix' unless RUBY_VERSION < "2.5")
33
+ ].compact
34
+
35
+ desc "Download lib release from github"
36
+ task :fetch do
37
+ Helpers.each_github_release_variant do |file:, sha256:, target_directory:, target_file:, **_|
38
+ target_url = "https://github.com/DataDog/libddprof/releases/download/v#{Libddprof::LIB_VERSION}/#{file}"
39
+
40
+ if File.exist?(target_file)
41
+ if Digest::SHA256.hexdigest(File.read(target_file)) == sha256
42
+ puts "Found #{target_file} matching the expected sha256, skipping download"
43
+ next
44
+ else
45
+ puts "Found #{target_file} BUT IT DID NOT MATCH THE EXPECTED sha256, skipping download"
46
+ end
47
+ end
48
+
49
+ puts "Going to download #{target_url} into #{target_file}"
50
+
51
+ File.open(target_file, "wb") do |file|
52
+ HTTP.follow.get(target_url).body.each { |chunk| file.write(chunk) }
53
+ end
54
+
55
+ if Digest::SHA256.hexdigest(File.read(target_file)) == sha256
56
+ puts "Success!"
57
+ else
58
+ raise "Downloaded file is corrupt, does not match expected sha256"
59
+ end
60
+ end
61
+ end
62
+
63
+ desc "Extract lib downloaded releases"
64
+ task extract: [:fetch] do
65
+ Helpers.each_github_release_variant do |target_directory:, target_file:, **_|
66
+ puts "Extracting #{target_file}"
67
+ File.open(target_file, "rb") do |file|
68
+ Gem::Package.new("").extract_tar_gz(file, target_directory)
69
+ end
70
+ end
71
+ end
72
+
73
+ desc "Package lib downloaded releases as gems"
74
+ task package: [:extract] do
75
+ gemspec = eval(File.read("libddprof.gemspec"), nil, "libddprof.gemspec") # standard:disable Security/Eval
76
+ FileUtils.mkdir_p("pkg")
77
+
78
+ Helpers.package_without_binaries(gemspec)
79
+ Helpers.package_linux_x86_64(gemspec)
80
+ end
81
+
82
+ desc "Release all packaged gems"
83
+ task package: [
84
+ :package,
85
+ :'release:guard_clean',
86
+ ] do
87
+
88
+ end
89
+
90
+ module Helpers
91
+ def self.each_github_release_variant(version: Libddprof::LIB_VERSION)
92
+ LIB_GITHUB_RELEASES.fetch(version).each do |file:, sha256:, ruby_platform:|
93
+ # These two are so common that we just centralize them here
94
+ target_directory = "vendor/libddprof-#{version}/#{ruby_platform}"
95
+ target_file = "#{target_directory}/#{file}"
96
+
97
+ FileUtils.mkdir_p(target_directory)
98
+
99
+ yield(file: file, sha256: sha256, ruby_platform: ruby_platform, target_directory: target_directory, target_file: target_file)
100
+ end
101
+ end
102
+
103
+ def self.package_without_binaries(gemspec)
104
+ target_gemspec = gemspec.dup
105
+
106
+ puts "Building a variant without binaries including: (this can take a while)"
107
+ pp target_gemspec.files
108
+
109
+ package = Gem::Package.build(target_gemspec)
110
+ FileUtils.mv(package, "pkg")
111
+ puts("-" * 80)
112
+ end
113
+
114
+ def self.package_linux_x86_64(gemspec)
115
+ # We include both glibc and musl variants in the same binary gem to avoid the issues
116
+ # documented in https://github.com/rubygems/rubygems/issues/3174
117
+ target_gemspec = gemspec.dup
118
+ target_gemspec.files += files_for("x86_64-linux", "x86_64-linux-musl")
119
+ target_gemspec.platform = "x86_64-linux"
120
+
121
+ puts "Building for x86_64-linux including:"
122
+ pp target_gemspec.files
123
+
124
+ package = Gem::Package.build(target_gemspec)
125
+ FileUtils.mv(package, "pkg")
126
+ puts("-" * 80)
127
+ end
128
+
129
+ def self.files_for(*included_platforms, version: Libddprof::LIB_VERSION)
130
+ files = []
131
+
132
+ each_github_release_variant(version: version) do |ruby_platform:, target_directory:, target_file:, **_|
133
+ next unless included_platforms.include?(ruby_platform)
134
+
135
+ files += Dir.glob("#{target_directory}/**/*").select { |path| File.file?(path) } - [target_file]
136
+ end
137
+
138
+ files
139
+ end
140
+ end
data/gems.rb ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in libddprof.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+ gem "rspec", "~> 3.10"
10
+ gem "standard", "~> 1.3" unless RUBY_VERSION < "2.5"
11
+ gem "http", "~> 5.0"
12
+ gem "pry"
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Libddprof
4
+ # Current libddprof version
5
+ LIB_VERSION = "0.2.0"
6
+
7
+ # This is the Ruby gem version -- often it will match LIB_VERSION, but sometimes it may not
8
+ VERSION = "#{LIB_VERSION}.beta1"
9
+ end
data/lib/libddprof.rb ADDED
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "libddprof/version"
4
+
5
+ module Libddprof
6
+ # Is this a no-op libddprof release without binaries?
7
+ def self.no_binaries?
8
+ available_binaries.empty?
9
+ end
10
+
11
+ def self.available_binaries
12
+ Dir.children(vendor_directory)
13
+ end
14
+
15
+ def self.pkgconfig_folder
16
+ current_platform = Gem::Platform.local.to_s
17
+
18
+ return unless available_binaries.include?(current_platform)
19
+
20
+ pkgconfig_file = Dir.glob("#{vendor_directory}/#{current_platform}/**/ddprof_ffi.pc").first
21
+
22
+ return unless pkgconfig_file
23
+
24
+ File.absolute_path(File.dirname(pkgconfig_file))
25
+ end
26
+
27
+ private_class_method def self.vendor_directory
28
+ ENV["LIBDDPROF_VENDOR_OVERRIDE"] || "#{__dir__}/../vendor/libddprof-#{Libddprof::LIB_VERSION}/"
29
+ end
30
+ end
data/libddprof.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "libddprof/version"
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "libddprof"
9
+ spec.version = Libddprof::VERSION
10
+ spec.authors = ["Datadog, Inc."]
11
+ spec.email = ["dev@datadoghq.com"]
12
+
13
+ spec.summary = "Library of common code used by Datadog Continuous Profiler for Ruby"
14
+ spec.description =
15
+ "libddprof contains implementation bits used by Datadog's ddtrace gem as part of its Continuous Profiler feature."
16
+ spec.homepage = "https://docs.datadoghq.com/tracing/profiler/"
17
+ spec.license = "Apache-2.0"
18
+ spec.required_ruby_version = ">= 2.1.0"
19
+
20
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
21
+
22
+ spec.metadata["homepage_uri"] = spec.homepage
23
+ spec.metadata["source_code_uri"] = "https://github.com/DataDog/libddprof/tree/main/ruby"
24
+
25
+ # Require releases on rubygems.org to be coming from multi-factor-auth-authenticated accounts
26
+ spec.metadata["rubygems_mfa_required"] = "true"
27
+
28
+ # Specify which files should be added to the gem when it is released.
29
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
30
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
31
+ `git ls-files -z`.split("\x0").reject do |f|
32
+ (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
33
+ end
34
+ end
35
+ spec.require_paths = ["lib"]
36
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: libddprof
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0.beta1
5
+ platform: ruby
6
+ authors:
7
+ - Datadog, Inc.
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-02-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: libddprof contains implementation bits used by Datadog's ddtrace gem
14
+ as part of its Continuous Profiler feature.
15
+ email:
16
+ - dev@datadoghq.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ".rspec"
22
+ - ".standard.yml"
23
+ - Rakefile
24
+ - gems.rb
25
+ - lib/libddprof.rb
26
+ - lib/libddprof/version.rb
27
+ - libddprof.gemspec
28
+ homepage: https://docs.datadoghq.com/tracing/profiler/
29
+ licenses:
30
+ - Apache-2.0
31
+ metadata:
32
+ allowed_push_host: https://rubygems.org
33
+ homepage_uri: https://docs.datadoghq.com/tracing/profiler/
34
+ source_code_uri: https://github.com/DataDog/libddprof/tree/main/ruby
35
+ rubygems_mfa_required: 'true'
36
+ post_install_message:
37
+ rdoc_options: []
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 2.1.0
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">"
48
+ - !ruby/object:Gem::Version
49
+ version: 1.3.1
50
+ requirements: []
51
+ rubygems_version: 3.1.6
52
+ signing_key:
53
+ specification_version: 4
54
+ summary: Library of common code used by Datadog Continuous Profiler for Ruby
55
+ test_files: []