package passenger import ( "fmt" "io/ioutil" "os" "testing" "github.com/influxdata/telegraf/testutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func fakePassengerStatus(stat string) { content := fmt.Sprintf("#!/bin/sh\ncat << EOF\n%s\nEOF", stat) ioutil.WriteFile("/tmp/passenger-status", []byte(content), 0700) } func teardown() { os.Remove("/tmp/passenger-status") } func Test_Invalid_Passenger_Status_Cli(t *testing.T) { r := &passenger{ Command: "an-invalid-command passenger-status", } var acc testutil.Accumulator err := r.Gather(&acc) require.Error(t, err) assert.Equal(t, err.Error(), `exec: "an-invalid-command": executable file not found in $PATH`) } func Test_Invalid_Xml(t *testing.T) { fakePassengerStatus("invalid xml") defer teardown() r := &passenger{ Command: "/tmp/passenger-status", } var acc testutil.Accumulator err := r.Gather(&acc) require.Error(t, err) assert.Equal(t, err.Error(), "Cannot parse input with error: EOF\n") } // We test this by ensure that the error message match the path of default cli func Test_Default_Config_Load_Default_Command(t *testing.T) { fakePassengerStatus("invalid xml") defer teardown() r := &passenger{} var acc testutil.Accumulator err := r.Gather(&acc) require.Error(t, err) assert.Equal(t, err.Error(), "exec: \"passenger-status\": executable file not found in $PATH") } func TestPassengerGenerateMetric(t *testing.T) { fakePassengerStatus(sampleStat) defer teardown() //Now we tested again above server, with our authentication data r := &passenger{ Command: "/tmp/passenger-status", } var acc testutil.Accumulator err := r.Gather(&acc) require.NoError(t, err) tags := map[string]string{ "passenger_version": "5.0.17", } fields := map[string]interface{}{ "process_count": 23, "max": 23, "capacity_used": 23, "get_wait_list_size": 3, } acc.AssertContainsTaggedFields(t, "passenger", fields, tags) tags = map[string]string{ "name": "/var/app/current/public", "app_root": "/var/app/current", "app_type": "rack", } fields = map[string]interface{}{ "processes_being_spawned": 2, "capacity_used": 23, "get_wait_list_size": 3, } acc.AssertContainsTaggedFields(t, "passenger_group", fields, tags) tags = map[string]string{ "name": "/var/app/current/public", } fields = map[string]interface{}{ "capacity_used": 23, "get_wait_list_size": 3, } acc.AssertContainsTaggedFields(t, "passenger_supergroup", fields, tags) tags = map[string]string{ "app_root": "/var/app/current", "group_name": "/var/app/current/public", "supergroup_name": "/var/app/current/public", "pid": "11553", "code_revision": "899ac7f", "life_status": "ALIVE", "process_group_id": "13608", } fields = map[string]interface{}{ "concurrency": 1, "sessions": 0, "busyness": 0, "processed": 951, "spawner_creation_time": int64(1452746835922747), "spawn_start_time": int64(1452746844946982), "spawn_end_time": int64(1452746845013365), "last_used": int64(1452747071764940), "uptime": int64(191026), // in seconds of 2d 5h 3m 46s "cpu": int64(58), "rss": int64(418548), "pss": int64(319391), "private_dirty": int64(314900), "swap": int64(0), "real_memory": int64(314900), "vmsize": int64(1563580), } acc.AssertContainsTaggedFields(t, "passenger_process", fields, tags) } var sampleStat = ` <?xml version="1.0" encoding="iso8859-1" ?> <?xml version="1.0" encoding="UTF-8"?> <info version="3"> <passenger_version>5.0.17</passenger_version> <group_count>1</group_count> <process_count>23</process_count> <max>23</max> <capacity_used>23</capacity_used> <get_wait_list_size>3</get_wait_list_size> <get_wait_list /> <supergroups> <supergroup> <name>/var/app/current/public</name> <state>READY</state> <get_wait_list_size>3</get_wait_list_size> <capacity_used>23</capacity_used> <secret>foo</secret> <group default="true"> <name>/var/app/current/public</name> <component_name>/var/app/current/public</component_name> <app_root>/var/app/current</app_root> <app_type>rack</app_type> <environment>production</environment> <uuid>QQUrbCVYxbJYpfgyDOwJ</uuid> <enabled_process_count>23</enabled_process_count> <disabling_process_count>0</disabling_process_count> <disabled_process_count>0</disabled_process_count> <capacity_used>23</capacity_used> <get_wait_list_size>3</get_wait_list_size> <disable_wait_list_size>0</disable_wait_list_size> <processes_being_spawned>2</processes_being_spawned> <secret>foo</secret> <api_key>foo</api_key> <life_status>ALIVE</life_status> <user>axcoto</user> <uid>1001</uid> <group>axcoto</group> <gid>1001</gid> <options> <app_root>/var/app/current</app_root> <app_group_name>/var/app/current/public</app_group_name> <app_type>rack</app_type> <start_command>/var/app/.rvm/gems/ruby-2.2.0-p645/gems/passenger-5.0.17/helper-scripts/rack-loader.rb</start_command> <startup_file>config.ru</startup_file> <process_title>Passenger RubyApp</process_title> <log_level>3</log_level> <start_timeout>90000</start_timeout> <environment>production</environment> <base_uri>/</base_uri> <spawn_method>smart</spawn_method> <default_user>nobody</default_user> <default_group>nogroup</default_group> <ruby>/var/app/.rvm/gems/ruby-2.2.0-p645/wrappers/ruby</ruby> <python>python</python> <nodejs>node</nodejs> <ust_router_address>unix:/tmp/passenger.eKFdvdC/agents.s/ust_router</ust_router_address> <ust_router_username>logging</ust_router_username> <ust_router_password>foo</ust_router_password> <debugger>false</debugger> <analytics>false</analytics> <api_key>foo</api_key> <min_processes>22</min_processes> <max_processes>0</max_processes> <max_preloader_idle_time>300</max_preloader_idle_time> <max_out_of_band_work_instances>1</max_out_of_band_work_instances> </options> <processes> <process> <pid>11553</pid> <sticky_session_id>378579907</sticky_session_id> <gupid>17173df-PoNT3J9HCf</gupid> <concurrency>1</concurrency> <sessions>0</sessions> <busyness>0</busyness> <processed>951</processed> <spawner_creation_time>1452746835922747</spawner_creation_time> <spawn_start_time>1452746844946982</spawn_start_time> <spawn_end_time>1452746845013365</spawn_end_time> <last_used>1452747071764940</last_used> <last_used_desc>0s ago</last_used_desc> <uptime>2d 5h 3m 46s</uptime> <code_revision>899ac7f</code_revision> <life_status>ALIVE</life_status> <enabled>ENABLED</enabled> <has_metrics>true</has_metrics> <cpu>58</cpu> <rss>418548</rss> <pss>319391</pss> <private_dirty>314900</private_dirty> <swap>0</swap> <real_memory>314900</real_memory> <vmsize>1563580</vmsize> <process_group_id>13608</process_group_id> <command>Passenger RubyApp: /var/app/current/public</command> <sockets> <socket> <name>main</name> <address>unix:/tmp/passenger.eKFdvdC/apps.s/ruby.UWF6zkRJ71aoMXPxpknpWVfC1POFqgWZzbEsdz5v0G46cSSMxJ3GHLFhJaUrK2I</address> <protocol>session</protocol> <concurrency>1</concurrency> <sessions>0</sessions> </socket> <socket> <name>http</name> <address>tcp://127.0.0.1:49888</address> <protocol>http</protocol> <concurrency>1</concurrency> <sessions>0</sessions> </socket> </sockets> </process> <process> <pid>11563</pid> <sticky_session_id>1549681201</sticky_session_id> <gupid>17173df-pX5iJOipd8</gupid> <concurrency>1</concurrency> <sessions>1</sessions> <busyness>2147483647</busyness> <processed>756</processed> <spawner_creation_time>1452746835922747</spawner_creation_time> <spawn_start_time>1452746845136882</spawn_start_time> <spawn_end_time>1452746845172460</spawn_end_time> <last_used>1452747071709179</last_used> <last_used_desc>0s ago</last_used_desc> <uptime>2d 5h 3m 46s</uptime> <code_revision>899ac7f</code_revision> <life_status>ALIVE</life_status> <enabled>ENABLED</enabled> <has_metrics>true</has_metrics> <cpu>47</cpu> <rss>418296</rss> <pss>314036</pss> <private_dirty>309240</private_dirty> <swap>0</swap> <real_memory>309240</real_memory> <vmsize>1563608</vmsize> <process_group_id>13608</process_group_id> <command>Passenger RubyApp: /var/app/current/public</command> <sockets> <socket> <name>main</name> <address>unix:/tmp/passenger.eKFdvdC/apps.s/ruby.PVCh7TmvCi9knqhba2vG5qXrlHGEIwhGrxnUvRbIAD6SPz9m0G7YlJ8HEsREHY3</address> <protocol>session</protocol> <concurrency>1</concurrency> <sessions>1</sessions> </socket> <socket> <name>http</name> <address>tcp://127.0.0.1:52783</address> <protocol>http</protocol> <concurrency>1</concurrency> <sessions>0</sessions> </socket> </sockets> </process> </processes> </group> </supergroup> </supergroups> </info>`