Last active
February 12, 2019 00:27
-
-
Save justinstoller/4887b4f659a09568c0d138f62685078d to your computer and use it in GitHub Desktop.
profiling server responding to catalog request in repl
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sellout:puppetserverspike justin$ lein with-profile +yk9k irb | |
Using 1G min heap since not set via PUPPETSERVER_HEAP_SIZE environment variable or user.puppetserver-heap-size in ~/.lein/profiles.clj file. Set to at least 5G for best performance during test runs. | |
Using 2G max heap since not set via PUPPETSERVER_HEAP_SIZE environment variable or user.puppetserver-heap-size in ~/.lein/profiles.clj file. Set to at least 5G for best performance during test runs. | |
[YourKit Java Profiler 2017.02-b66] Log file: /Users/justin/.yjp/log/main-78581.log | |
irb(main):001:0> load './puppet_server_helper.rb' | |
WARN: Unresolved specs during Gem::Specification.reset: | |
gettext (>= 3.0.2) | |
WARN: Clearing out unresolved specs. | |
Please report a bug if this causes problems. | |
=> true | |
irb(main):002:0> helper = PuppetServerHelper.new | |
=> #<PuppetServerHelper:0x2d4c9746 @clientname="localhost", @metric_registry=#<Java::ComCodahaleMetrics::MetricRegistry:0x41019971>, @servername="localhost", @root_dir="/Users/justin/.puppetlabs", @profiler=#<Puppet::Server::JvmProfiler:0x4ab4b4cd @profiler=#<struct Struct::Profiler >>, @env_registry=#<struct Struct::Registry>> | |
irb(main):003:0> server = helper.load_puppet_server! | |
2017-12-06 13:44:54,570 WARN [main] [puppetserver] Puppet Support for ruby version 1.9.3 is deprecated and will be removed in a future release. See https://docs.puppet.com/puppet/latest/system_requirements.html#ruby for a list of supported ruby versions. | |
(at /Users/justin/Backup/code/work/server/puppetserverspike/ruby/puppet/lib/puppet.rb:134:in `Puppet') | |
=> #<Puppet::Server::Master:0x46611be4 @routes=[Route /^\/puppet\//], @env_loader=#<Puppet::Environments::Cached:0x2dd7a886 @expirations=#<SortedSet: {0001-01-01 00:00:00 UTC}>, @cache={"production"=>#<Puppet::Environments::Cached::NotCachedEntry:0x1f9c9485 @value=<Puppet::Node::Environment:3330 @name="production" @manifest="/Users/justin/.puppetlabs/etc/code/environments/production/manifests" @modulepath="/Users/justin/.puppetlabs/etc/code/environments/production/modules:/Users/justin/.puppetlabs/etc/code/modules:/opt/puppetlabs/puppet/modules" >>}, @next_expiration=0001-01-01 00:00:00 UTC, @loader=#<Puppet::Environments::Combined:0x5deae5ef @loaders=[#<Puppet::Environments::Directories:0x55be2608 @environment_dir="/Users/justin/.puppetlabs/etc/code/environments", @global_module_path=["/Users/justin/.puppetlabs/etc/code/modules", "/opt/puppetlabs/puppet/modules"]>, #<Puppet::Environments::StaticPrivate:0x24b2e53b @environments=[<Puppet::Node::Environment:3332 @name="production" @manifest="no_manifest" @modulepath="/Users/justin/.puppetlabs/etc/code/modules:/opt/puppetlabs/puppet/modules" >]>]>, @cache_expiration_service=#<Puppet::Server::Environments::Cached::CacheExpirationService:0x60ca607 @environment_registry=#<struct Struct::Registry >>>> | |
irb(main):004:0> req = helper.basic_catalog_request | |
irb(main):005:0> yk = Java.com.yourkit.api.Controller.new | |
=> #<Java::ComYourkitApi::Controller:0x5d33426a> | |
irb(main):006:0> yk.start_allocation_recording("") | |
=> nil | |
irb(main):012:0> 3.times {|_| server.handleRequest(req) } | |
2017-12-06 13:47:31,156 WARN [main] [puppetserver] Puppet Host is missing hostname and/or domain: localhost | |
2017-12-06 13:47:39,073 WARN [main] [puppetserver] Puppet Host is missing hostname and/or domain: localhost | |
2017-12-06 13:47:46,910 WARN [main] [puppetserver] Puppet Host is missing hostname and/or domain: localhost | |
=> 3 | |
irb(main):013:0> yk.capture_memory_snapshot | |
=> "/Users/justin/Snapshots/main-2017-12-06-1.snapshot" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{:yk-shared | |
{:resource-paths | |
[ | |
"/Users/justin/Desktop/YourKit-Java-Profiler-2017.02.app/Contents/Resources/lib/yjp-controller-api-redist.jar" | |
"/Users/justin/Desktop/YourKit-Java-Profiler-2017.02.app/Contents/Resources/lib/yjp.jar"] | |
:jvm-opts | |
[ | |
"-Djruby.reify.variables=false" | |
"-Djruby.reify.classes=true" | |
"-agentpath:/Users/justin/Desktop/YourKit-Java-Profiler-2017.02.app/Contents/Resources/bin/mac/libyjpagent.jnilib"]} | |
:yk17 [:yk-shared {:dependencies [[puppetlabs/jruby-deps "1.7.27-1"]]}] | |
:yk9k [:yk-shared {:dependencies [[puppetlabs/jruby-deps "9.1.11.0-1"]]}]} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'puppet/server/master' | |
require 'securerandom' | |
require 'json' | |
require 'uri' | |
class PuppetServerHelper | |
# alternatively: load 'spec/lib/puppet_spec/handler'; profiler = PuppetSpec::HandlerProfiler.new ???? | |
NullProfiler = Struct.new("Profiler") do | |
def start(*args); end | |
def finish(*args); end | |
def shutdown(*args); end | |
end | |
NullRegistry = Struct.new("Registry") do | |
def register_environment(env); end | |
def is_expired?(env); true; end | |
def remove_environment(env); end | |
def evicted(env); end | |
end | |
attr_accessor :root_dir, :servername, :clientname, | |
:profiler, :env_registry, :metric_registry | |
def initialize | |
@root_dir = ENV['HOME'] + '/.puppetlabs' | |
@servername = @clientname = 'localhost' | |
@profiler = Puppet::Server::JvmProfiler.new(NullProfiler.new) | |
@env_registry = NullRegistry.new | |
import com.codahale.metrics.MetricRegistry | |
@metric_registry = Java::ComCodahaleMetrics::MetricRegistry.new | |
end | |
def default_puppet_config(overrides = {}) | |
{ | |
"codedir" => @root_dir + '/etc/code', | |
"confdir" => @root_dir + '/etc/puppet', | |
"vardir" => @root_dir + '/opt/puppet/cache', | |
"rundir" => @root_dir + '/var/run', | |
"logdir" => @root_dir + '/var/log' | |
}.merge(overrides) | |
end | |
def default_server_config(overrides = {}) | |
{ | |
"metric_registry" => @metric_registry, | |
"use_legacy_auth_conf" => false, | |
"environment_registry" => @env_registry, | |
"http_connect_timeout_milliseconds" => 120000, | |
"http_idle_timeout_milliseconds" => 1200000, | |
"profiler" => @profiler, | |
"server_id" => @servername, | |
}.merge(overrides) | |
end | |
def load_puppet_server! | |
puppet_config = default_puppet_config | |
puppet_server_config = default_server_config | |
Puppet::Server::Master.new(puppet_config, puppet_server_config) | |
end | |
def create_facts(values = {}, name = clientname) | |
{ | |
'name' => name, | |
'values' => values, | |
'timestamp' => Time.now.iso8601 | |
} | |
end | |
def create_params(facts = create_facts, env = 'production') | |
{ | |
"fail_on_404" => "true", | |
"code_id" => nil, | |
"facts" => URI.encode(JSON.dump(facts)), | |
"rest" => "localhost", | |
"transaction_uuid" => SecureRandom.uuid, | |
"static_catalog" => "true", | |
"checksum_type" => "md5.sha256", | |
"environment" => env, | |
"facts_format" => "application/json" | |
} | |
end | |
def create_cert(cert_path = root_dir + '/etc/puppet/ssl/certs/' + clientname + '.pem') | |
import com.puppetlabs.ssl_utils.SSLUtils | |
pem = File.read(cert_path) | |
reader = Java::JavaIo::StringReader.new(pem) | |
Java::ComPuppetlabsSsl_utils::SSLUtils.pemToCert(reader) | |
end | |
def basic_catalog_request(params = create_params, | |
cert = create_cert, | |
client = clientname, | |
server = servername) | |
{ | |
"authenticated" => true, | |
"params" => params, | |
"remote-addr" => "0:0:0:0:0:0:0:1", | |
"client-cert-cn" => client, | |
"client-cert" => cert, | |
"body" => URI.encode(JSON.dump(params)), | |
"request-method" => "POST", | |
"uri" => "/puppet/v3/catalog/" + client, | |
"headers" => { | |
"accept" => "application/json, application/x-msgpack, text/pson", | |
"x-puppet-version" => "5.3.3", | |
"user-agent" => "Puppet/5.3.3 Ruby/2.2.7-p470 (x86_64-darwin16)", | |
"host" => server + ":8140", | |
"accept-encoding" => "gzip;q=1.0,deflate; q=0.6,identity;q=0.3", | |
"content-length" => "7278", | |
"content-type" => "application/x-www-form-urlencoded" | |
} | |
} | |
end | |
def response_to_hash(java_res) | |
{ | |
body: java_res.getBody, | |
status: java_res.getStatus, | |
content_type: java_res.getContentType, | |
puppet_version: java_res.getPuppetVersion | |
} | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment