/// <summary>
        /// Initializes a new instance of the <see cref="AgentRunner"/> class.
        /// </summary>
        public AgentRunner()
        {
            Logger.Info("Starting agent");
            bool firstRun = true;

            if (File.Exists(configFile))
            {
                firstRun = false;
                dynamic root = JsonConvert.DeserializeObject(File.ReadAllText(configFile));
                Logger.Info("Configuring agent");
                Config.Setup(root, false);
            }
            else
            {
                Logger.Info("Configuring agent for first run");
                Config.Setup(new JObject(), true);
            }

            Thread executionThread = new Thread(new ThreadStart(delegate
            {
                if (firstRun)
                {
                    Bootstrap bootStrap = new Bootstrap();
                    bootStrap.Configure();
                }
                Monit.GetInstance().Start();
                Monit.GetInstance().StartServices();
                Handler.Start();
            }
                                                                ));

            executionThread.Name         = "Execution Thread";
            executionThread.IsBackground = true;
            executionThread.Start();
        }
        ////def heartbeat_payload
        ////  job_state = Bosh::Agent::Monit.service_group_state
        ////  monit_vitals = Bosh::Agent::Monit.get_vitals

        ////  # TODO(?): move DiskUtil out of Message namespace
        ////  disk_usage = Bosh::Agent::Message::DiskUtil.get_usage

        ////  job_name = @state["job"] ? @state["job"]["name"] : nil
        ////  index = @state["index"]

        ////  vitals = monit_vitals.merge("disk" => disk_usage)

        ////  Yajl::Encoder.encode("job" => job_name,
        ////                       "index" => index,
        ////                       "job_state" => job_state,
        ////                       "vitals" => vitals,
        ////                       "ntp" => Bosh::Agent::NTP.offset)
        ////end
        private static string GetHearbeatPayload()
        {
            HeartbeatMessage heartBeatMessage = new HeartbeatMessage();

            Vitals systemVitals = Monit.GetInstance().GetVitals;

            heartBeatMessage.Job = Config.State.Job != null ? Config.State.Job.Name : null;
            dynamic stateHash = Config.State.ToHash();

            if (stateHash["index"] != null)
            {
                heartBeatMessage.Index = Convert.ToInt32(stateHash["index"].Value);
            }
            heartBeatMessage.JobState = Monit.GetInstance().GetServiceGroupState;
            heartBeatMessage.Vitals   = systemVitals;
            heartBeatMessage.NtpMsg   = Ntp.GetNtpOffset();

            string result = JsonConvert.SerializeObject(heartBeatMessage);

            return(result);
        }