diff --git a/lib/puppet/util/instrumentation/listeners/process_name.rb b/lib/puppet/util/instrumentation/listeners/process_name.rb deleted file mode 100644 index 40bb44d8f..000000000 --- a/lib/puppet/util/instrumentation/listeners/process_name.rb +++ /dev/null @@ -1,112 +0,0 @@ -require 'monitor' - -# Unlike the other instrumentation plugins, this one doesn't give back -# data. Instead it changes the process name of the currently running process -# with the last labels and data. -Puppet::Util::Instrumentation.new_listener(:process_name) do - include Sync_m - - # start scrolling when process name is longer than - SCROLL_LENGTH = 50 - - attr_accessor :active, :reason - - def notify(label, event, data) - start(label) if event == :start - stop if event == :stop - end - - def start(activity) - push_activity(Thread.current, activity) - end - - def stop() - pop_activity(Thread.current) - end - - def subscribed - synchronize do - @oldname = $0 - @scroller ||= Thread.new do - loop do - scroll - sleep 1 - end - end - end - end - - def unsubscribed - synchronize do - $0 = @oldname if @oldname - Thread.kill(@scroller) - @scroller = nil - end - end - - def setproctitle - $0 = "#{base}: " + rotate(process_name,@x) - end - - def push_activity(thread, activity) - synchronize do - @reason ||= {} - @reason[thread] ||= [] - @reason[thread].push(activity) - setproctitle - end - end - - def pop_activity(thread) - synchronize do - @reason[thread].pop - if @reason[thread].empty? - @reason.delete(thread) - end - setproctitle - end - end - - def process_name - out = (@reason || {}).inject([]) do |out, reason| - out << "#{thread_id(reason[0])} #{reason[1].join(',')}" - end - out.join(' | ') - end - - # Getting the ruby thread id might not be portable to other ruby - # interpreters than MRI, because Thread#inspect might not return the same - # information on a different runtime. - def thread_id(thread) - thread.inspect.gsub(/^#<.*:0x([a-f0-9]+) .*>$/, '\1') - end - - def rotate(string, steps) - steps ||= 0 - if string.length > 0 && steps > 0 - steps = steps % string.length - return string[steps..-1].concat( " -- #{string[0..(steps-1)]}" ) - end - string - end - - def base - basename = case Puppet.run_mode.name - when :master - "master" - when :agent - "agent" - else - "puppet" - end - end - - def scroll - @x ||= 1 - return if process_name.length < SCROLL_LENGTH - synchronize do - setproctitle - @x += 1 - end - end -end diff --git a/spec/unit/util/instrumentation/listeners/process_name_spec.rb b/spec/unit/util/instrumentation/listeners/process_name_spec.rb deleted file mode 100755 index 521257214..000000000 --- a/spec/unit/util/instrumentation/listeners/process_name_spec.rb +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/env rspec -require 'spec_helper' -require 'puppet/util/instrumentation' - -Puppet::Util::Instrumentation.init -process_name = Puppet::Util::Instrumentation.listener(:process_name) - -describe process_name do - before(:each) do - @process_name = process_name.new - end - - it "should have a notify method" do - @process_name.should respond_to(:notify) - end - - it "should not have a data method" do - @process_name.should_not respond_to(:data) - end - - describe "when managing thread activity" do - before(:each) do - @process_name.stubs(:setproctitle) - @process_name.stubs(:base).returns("base") - end - - it "should be able to append activity" do - thread1 = stub 'thread1' - @process_name.push_activity(:thread1,"activity1") - @process_name.push_activity(:thread1,"activity2") - - @process_name.reason[:thread1].should == ["activity1", "activity2"] - end - - it "should be able to remove activity" do - @process_name.push_activity(:thread1,"activity1") - @process_name.push_activity(:thread1,"activity1") - @process_name.pop_activity(:thread1) - - @process_name.reason[:thread1].should == ["activity1"] - end - - it "should maintain activity thread by thread" do - @process_name.push_activity(:thread1,"activity1") - @process_name.push_activity(:thread2,"activity2") - - @process_name.reason[:thread1].should == ["activity1"] - @process_name.reason[:thread2].should == ["activity2"] - end - - it "should set process title" do - @process_name.expects(:setproctitle) - - @process_name.push_activity("thread1","activity1") - end - end - - describe "when computing the current process name" do - before(:each) do - @process_name.stubs(:setproctitle) - @process_name.stubs(:base).returns("base") - end - - it "should include every running thread activity" do - thread1 = stub 'thread1', :inspect => "\#", :hash => 1 - thread2 = stub 'thread2', :inspect => "\#", :hash => 0 - - @process_name.push_activity(thread1,"Compiling node1.domain.com") - @process_name.push_activity(thread2,"Compiling node4.domain.com") - @process_name.push_activity(thread1,"Parsing file site.pp") - @process_name.push_activity(thread2,"Parsing file node.pp") - - @process_name.process_name.should =~ /12344321 Compiling node4.domain.com,Parsing file node.pp/ - @process_name.process_name.should =~ /deadbeef Compiling node1.domain.com,Parsing file site.pp/ - end - end - - describe "when finding base process name" do - {:master => "master", :agent => "agent", :user => "puppet"}.each do |program,base| - it "should return #{base} for #{program}" do - Puppet.run_mode.stubs(:name).returns(program) - @process_name.base.should == base - end - end - end - - describe "when finding a thread id" do - it "should return the id from the thread inspect string" do - thread = stub 'thread', :inspect => "\#" - @process_name.thread_id(thread).should == "1234abdc" - end - end - - describe "when scrolling the instrumentation string" do - it "should rotate the string of various step" do - @process_name.rotate("this is a rotation", 10).should == "rotation -- this is a " - end - - it "should not rotate the string for the 0 offset" do - @process_name.rotate("this is a rotation", 0).should == "this is a rotation" - end - end - - describe "when setting process name" do - before(:each) do - @process_name.stubs(:process_name).returns("12345 activity") - @process_name.stubs(:base).returns("base") - @oldname = $0 - end - - after(:each) do - $0 = @oldname - end - - it "should do it if the feature is enabled" do - @process_name.setproctitle - - $0.should == "base: 12345 activity" - end - end - - describe "when subscribed" do - before(:each) do - thread = stub 'thread', :inspect => "\#" - Thread.stubs(:current).returns(thread) - end - - it "should start the scroller" do - Thread.expects(:new) - @process_name.subscribed - end - end - - describe "when unsubscribed" do - before(:each) do - @thread = stub 'scroller', :inspect => "\#" - Thread.stubs(:new).returns(@thread) - Thread.stubs(:kill) - @oldname = $0 - @process_name.subscribed - end - - after(:each) do - $0 = @oldname - end - - it "should stop the scroller" do - Thread.expects(:kill).with(@thread) - @process_name.unsubscribed - end - - it "should reset the process name" do - $0 = "let's see what happens" - @process_name.unsubscribed - $0.should == @oldname - end - end - - describe "when setting a probe" do - before(:each) do - thread = stub 'thread', :inspect => "\#" - Thread.stubs(:current).returns(thread) - Thread.stubs(:new) - @process_name.active = true - end - - it "should push current thread activity and execute the block" do - @process_name.notify(:instrumentation, :start, {}) - $0.should == "puppet: 1234abdc instrumentation" - @process_name.notify(:instrumentation, :stop, {}) - end - - it "should finally pop the activity" do - @process_name.notify(:instrumentation, :start, {}) - @process_name.notify(:instrumentation, :stop, {}) - $0.should == "puppet: " - end - end - - describe "when scrolling" do - it "should do nothing for shorter process names" do - @process_name.expects(:setproctitle).never - @process_name.scroll - end - - it "should call setproctitle" do - @process_name.stubs(:process_name).returns("x" * 60) - @process_name.expects(:setproctitle) - @process_name.scroll - end - - it "should increment rotation offset" do - name = "x" * 60 - @process_name.stubs(:process_name).returns(name) - @process_name.expects(:rotate).once.with(name,1).returns("") - @process_name.expects(:rotate).once.with(name,2).returns("") - @process_name.scroll - @process_name.scroll - end - end -end \ No newline at end of file