Skip to content

Instantly share code, notes, and snippets.

@justinstoller
Last active February 12, 2019 00:27
Show Gist options
  • Save justinstoller/4887b4f659a09568c0d138f62685078d to your computer and use it in GitHub Desktop.
Save justinstoller/4887b4f659a09568c0d138f62685078d to your computer and use it in GitHub Desktop.
profiling server responding to catalog request in repl
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"
{: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"]]}]}
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