Ejemplo n.º 1
0
void k8s_dispatcher::dispatch()
{
	for (list::iterator it = m_messages.begin(); it != m_messages.end();)
	{
		if(is_ready(*it))
		{
			Json::Value root;
			Json::Reader reader;
			if(reader.parse(*it, root, false))
			{
				std::ostringstream os;
				msg_data data = get_msg_data(root);
				if(data.is_valid())
				{
					std::ostringstream os;
					os << '[' << to_reason_desc(data.m_reason) << ',';
					switch (m_type)
					{
						case k8s_component::K8S_NODES:
							os << "NODE,";
							handle_node(root, data);
							break;
						case k8s_component::K8S_NAMESPACES:
							os << "NAMESPACE,";
							handle_namespace(root, data);
							break;
						case k8s_component::K8S_PODS:
							os << "POD,";
							handle_pod(root, data);
							break;
						case k8s_component::K8S_REPLICATIONCONTROLLERS:
							os << "REPLICATION_CONTROLLER,";
							handle_rc(root, data);
							break;
						case k8s_component::K8S_SERVICES:
							os << "SERVICE,";
							handle_service(root, data);
							break;
						default:
						{
							std::ostringstream eos;
							eos << "Unknown component: " << static_cast<int>(m_type);
							throw sinsp_exception(os.str());
						}
					}
					os << data.m_name << ',' << data.m_uid << ',' << data.m_namespace << ']';
					g_logger.log(os.str(), sinsp_logger::SEV_INFO);
					//g_logger.log(root.toStyledString(), sinsp_logger::SEV_DEBUG);
					{
						K8S_LOCK_GUARD_MUTEX;
						m_state.update_cache(m_type);
					}
				}
			}
			else
			{
				// TODO: bad notification - discard or throw?
				g_logger.log("Bad JSON message received.", sinsp_logger::SEV_ERROR);
			}
			it = m_messages.erase(it);
		}
		else
		{
			++it;
		}
	}
}
Ejemplo n.º 2
0
void k8s_event_handler::handle_json(Json::Value&& root)
{
	/*if(g_logger.get_severity() >= sinsp_logger::SEV_TRACE)
	{
		g_logger.log(json_as_string(root), sinsp_logger::SEV_TRACE);
	}*/

	if(!m_state)
	{
		throw sinsp_exception("k8s_handler (" + get_id() + "), state is null for " + get_url() + ").");
	}
	const Json::Value& type = root["type"];
	if(!type.isNull())
	{
		if(type.isConvertibleTo(Json::stringValue))
		{
			const Json::Value& kind = root["kind"];
			if(!kind.isNull())
			{
				if(kind.isConvertibleTo(Json::stringValue))
				{
					std::string t = type.asString();
					std::string k = kind.asString();
					for(const Json::Value& item : root["items"])
					{
						msg_data data = get_msg_data(t, k, item);
						std::string reason_type = data.get_reason_desc();
						if(data.m_reason != k8s_component::COMPONENT_ADDED &&
							data.m_reason != k8s_component::COMPONENT_MODIFIED &&
							data.m_reason != k8s_component::COMPONENT_DELETED &&
							data.m_reason != k8s_component::COMPONENT_ERROR)
						{
							g_logger.log(std::string("Unsupported K8S " + name() + " event reason: ") +
										 std::to_string(data.m_reason), sinsp_logger::SEV_ERROR);
							continue;
						}
						/*if(g_logger.get_severity() >= sinsp_logger::SEV_TRACE)
						{
							g_logger.log("K8s handling event:\n" + json_as_string(item), sinsp_logger::SEV_TRACE);
						}*/
						if(handle_component(item, &data))
						{
							std::ostringstream os;
							os << "K8s [" + reason_type + ", " << data.m_kind <<
								", " << data.m_name << ", " << data.m_uid << "]";
							g_logger.log(os.str(), sinsp_logger::SEV_INFO);
						}
						else if(!m_event_ignored)
						{
							g_logger.log("K8s: error occurred while handling " + reason_type +
										 " event for " + data.m_kind + ' ' + data.m_name + " [" +
										 data.m_uid + ']', sinsp_logger::SEV_ERROR);
						}
						m_event_ignored = false;
					} // end for items
				}
			}
		}
		else
		{
			g_logger.log(std::string("K8S event type is not string."), sinsp_logger::SEV_ERROR);
		}
	}
	else
	{
		g_logger.log(std::string("K8S event type is null."), sinsp_logger::SEV_ERROR);
	}
}