bool sinsp_container_manager::set_mesos_task_id(sinsp_container_info* container, sinsp_threadinfo* tinfo) { ASSERT(container); ASSERT(tinfo); // there are applications that do not share their environment in /proc/[PID]/environ // since we need MESOS_TASK_ID environment variable to discover Mesos containers, // there is a workaround for such cases: // - for docker containers, we discover it directly from container, through Remote API // (see sinsp_container_manager::parse_docker() for details) // - for mesos native containers, parent process has the MESOS_TASK_ID (or equivalent, see // get_env_mesos_task_id(sinsp_threadinfo*) implementation) environment variable, so we // peek into the parent process environment to discover it if(container && tinfo) { string& mtid = container->m_mesos_task_id; if(mtid.empty()) { mtid = get_env_mesos_task_id(tinfo); if(!mtid.empty()) { g_logger.log("Mesos native container: [" + container->m_id + "], Mesos task ID: " + mtid, sinsp_logger::SEV_DEBUG); return true; } else { g_logger.log("Mesos task ID not found for Mesos container [" + container->m_id + "]," "thread [" + std::to_string(tinfo->m_tid) + ']', sinsp_logger::SEV_WARNING); } } } return false; }
string sinsp_container_manager::get_env_mesos_task_id(sinsp_threadinfo* tinfo) { string mtid; if(tinfo) { // Mesos task ID detection is not a straightforward task; // this list may have to be extended. mtid = tinfo->get_env("MESOS_TASK_ID"); // Marathon if(!mtid.empty()) { return mtid; } mtid = tinfo->get_env("mesos_task_id"); // Chronos if(!mtid.empty()) { return mtid; } mtid = tinfo->get_env("MESOS_EXECUTOR_ID"); // others if(!mtid.empty()) { return mtid; } sinsp_threadinfo* ptinfo = tinfo->get_parent_thread(); if(ptinfo && ptinfo->m_tid > 1) { mtid = get_env_mesos_task_id(ptinfo); } } return mtid; }
bool libsinsp::container_engine::mesos::set_mesos_task_id(sinsp_container_info* container, sinsp_threadinfo* tinfo) { ASSERT(container); ASSERT(tinfo); // there are applications that do not share their environment in /proc/[PID]/environ // since we need MESOS_TASK_ID environment variable to discover Mesos containers, // there is a workaround for such cases: // - for docker containers, we discover it directly from container, through Remote API // (see sinsp_container_manager::parse_docker() for details) // - for mesos native containers, parent process has the MESOS_TASK_ID (or equivalent, see // get_env_mesos_task_id(sinsp_threadinfo*) implementation) environment variable, so we // peek into the parent process environment to discover it if(container && tinfo) { string& mtid = container->m_mesos_task_id; if(mtid.empty()) { mtid = get_env_mesos_task_id(tinfo); // Ensure that the mesos task id vaguely looks // like a real id. We assume it must be at // least 3 characters and contain a dot or underscore if(!mtid.empty() && mtid.length()>=3 && (mtid.find_first_of("._") != std::string::npos)) { g_logger.log("Mesos native container: [" + container->m_id + "], Mesos task ID: " + mtid, sinsp_logger::SEV_DEBUG); return true; } else { g_logger.log("Mesos container [" + container->m_id + "]," "thread [" + std::to_string(tinfo->m_tid) + "], has likely malformed mesos task id [" + mtid + "], ignoring", sinsp_logger::SEV_DEBUG); } } } return false; }