#include "Report_Full.h" size_t Report_Full::m_lastTotalPageCount=0; Report_Full::Report_Full(const SpiderManager *_sm): Report(_sm) { size_t pageCount=InternetResource::m_count; opentag("report"); opentag("summary"); addAttribute("memory", m_sm->m_memoryUsage); addAttribute("DBQueue", m_sm->m_objects.size()); addAttribute("lastPageCount", m_lastTotalPageCount); addAttribute("pageCount", pageCount); addAttribute("selectInterval", DomainConnection::lastInterval()); #ifdef _LINUX addAttribute("pages_total", sysconf(_SC_PHYS_PAGES)); addAttribute("pages_free", sysconf(_SC_AVPHYS_PAGES)); addAttribute("pages_size", sysconf(_SC_PAGE_SIZE)); #endif closetag("summary"); opentag("spiders"); //copy the Spiders list in case it changes during the report StringMap spidersCopy; spidersCopy.insert(m_sm->begin(), m_sm->end()); //atomic? for (StringMap::const_iterator i = spidersCopy.begin(); i != spidersCopy.end(); i++) spider(i->second); closetag("spiders"); closetag("report"); m_lastTotalPageCount = pageCount; } void Report_Full::spider(const Spider *spider) { if (spider && spider->m_domain) { pthread_mutex_lock(&DomainConnection::m_hEventLoop_mutex); Domain *domain = spider->m_domain; opentag("spider"); addAttribute("lastAction", (size_t)(time(0)-spider->m_dc.m_lastEvent)); addAttribute("spiderStatus", spiderStatus[spider->m_status]); //DomainConnection statuses addAttribute("dcMode", dcMode[spider->m_dc.m_mode]); addAttribute("ip", spider->m_dc.m_sin.sin_addr); addAttribute("socket", spider->m_dc.m_s); addAttribute("keepAlive", domain->m_keepAlive); addAttribute("readyForReading", spider->m_dc.m_readyForReading); addAttribute("readyForWriting", spider->m_dc.m_readyForWriting); addAttribute("threwException", spider->m_dc.m_threwException); addAttribute("somethingReady", spider->m_dc.m_somethingReady); addAttribute("timedout", spider->m_dc.m_timedout); addAttribute("rfds", spider->m_dc.FD_ISSET_rdfs()); addAttribute("wfds", spider->m_dc.FD_ISSET_wdfs()); addAttribute("xfds", spider->m_dc.FD_ISSET_xdfs()); opentag("responseProtocols"); const char *protocol[] = {"unknown", "http_1_0", "http_1_1"}; for (vector::const_iterator i = domain->m_responseProtocols.begin(); i != domain->m_responseProtocols.end(); i++) { if (*i) addAttribute(protocol[*i], true); } closetag("responseProtocols"); opentag("conversationEndSchemes"); static const char *conversationEndScheme[] = {"unknown", "notStated", "chunkedEncoding", "closeConnection", "contentLength"}; for (vector::const_iterator i = domain->m_ConversationEndSchemes.begin(); i != domain->m_ConversationEndSchemes.end(); i++) { if (*i) addAttribute(conversationEndScheme[*i], true); } closetag("conversationEndSchemes"); opentag("domain"); addAttribute("id", domain->m_domainID); addAttribute("name", domain->m_domain); addAttribute("allpages", domain->m_pages.size()); addAttribute("documents", domain->m_documents.size()); addAttribute("newlinks", domain->m_newlinks.size()); addAttribute("repeaters", domain->m_repeaters); addAttribute("md5Hits", domain->m_md5hits); addAttribute("pagesPerSecond", domain->pagesPerSecond()); addAttribute("sweep", domain->sweep()); addAttribute("googleCount", domain->googleCount()); addAttribute("memory", domain->m_memoryUsage); addAttribute("parsers", domain->m_parsers.size()); opentag("responseCodes"); for (map::const_iterator i = domain->m_HTTPReturnCodes.begin(); i != domain->m_HTTPReturnCodes.end(); i++) { opentag("code"); addAttribute("id", i->first); addAttribute("count", i->second); closetag("code"); } closetag("responseCodes"); closetag("domain"); closetag("spider"); } pthread_mutex_unlock(&DomainConnection::m_hEventLoop_mutex); }