void read_nginx_domain_stats(struct module *mod, char *parameter) { int i, addr_len, domain, m, sockfd, send, pos = 0; char buf[LEN_10240], request[LEN_4096], line[LEN_4096]; char *p; void *addr; FILE *stream = NULL; struct sockaddr_in servaddr; struct sockaddr_un servaddr_un; struct hostinfo hinfo; struct stats_nginx_domain stat; struct stats_nginx_domain *pair; /* get peer info */ init_nginx_host_info(&hinfo); nginx_domain_init(parameter); hinfo.port = nginx_port; if (*hinfo.host == '/') { addr = &servaddr_un; addr_len = sizeof(servaddr_un); bzero(addr, addr_len); domain = AF_LOCAL; servaddr_un.sun_family = AF_LOCAL; strncpy(servaddr_un.sun_path, hinfo.host, sizeof(servaddr_un.sun_path) - 1); } else { addr = &servaddr; addr_len = sizeof(servaddr); bzero(addr, addr_len); domain = AF_INET; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(hinfo.port); inet_pton(AF_INET, hinfo.host, &servaddr.sin_addr); } /* send request */ if ((sockfd = socket(domain, SOCK_STREAM, 0)) == -1) { return; } sprintf(request, "GET %s HTTP/1.0\r\n" "User-Agent: taobot\r\n" "Host: %s\r\n" "Accept:*/*\r\n" "Connection: Close\r\n\r\n", hinfo.uri, hinfo.server_name); if ((m = connect(sockfd, (struct sockaddr *) addr, addr_len)) == -1 ) { return; } if ((send = write(sockfd, request, strlen(request))) == -1) { return; } /* read & parse request */ if ((stream = fdopen(sockfd, "r")) == NULL) { close(sockfd); return; } while (fgets(line, LEN_4096, stream) != NULL) { if ((p = strchr(line, ',')) == NULL) { continue; } *p++ = '\0'; /* stat.domain terminating null */ memset(&stat, 0, sizeof(struct stats_nginx_domain)); if (sscanf(p, "%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu," "%*u,%*u,%*u,%*u,%*u,%*u,%*u,%*u,%*u,%*u,%*u,%*u,%*u,%*u", &stat.nbytesin, &stat.nbytesout, &stat.nconn, &stat.nreq, &stat.n2XX, &stat.n3XX, &stat.n4XX, &stat.n5XX, &stat.nother, &stat.rt, &stat.upreq, &stat.uprt, &stat.upactreq) != 13) { continue; } strcpy(stat.domain, line); if (all_domain == 0) { pair = bsearch(&stat, nginx_domain_stats, domain_num, sizeof(nginx_domain_stats[0]), nginxcmp); if (pair == NULL) { continue; } else { memcpy(pair, &stat, sizeof(struct stats_nginx_domain)); } } else { memcpy(&nginx_domain_stats[domain_num], &stat, sizeof(struct stats_nginx_domain)); domain_num++; } } if (top_domain == 0 || top_domain > domain_num) { top_domain = domain_num; } qsort(nginx_domain_stats, domain_num, sizeof(nginx_domain_stats[0]), nginxcmp2); for (i=0; i< top_domain; i++) { pos += snprintf(buf + pos, LEN_10240 - pos, "%s=%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld" ITEM_SPLIT, nginx_domain_stats[i].domain, nginx_domain_stats[i].nconn, nginx_domain_stats[i].nreq, nginx_domain_stats[i].n2XX, nginx_domain_stats[i].n3XX, nginx_domain_stats[i].n4XX, nginx_domain_stats[i].n5XX, nginx_domain_stats[i].rt, nginx_domain_stats[i].uprt, nginx_domain_stats[i].upreq, nginx_domain_stats[i].upactreq); if (strlen(buf) == LEN_10240 - 1) { fclose(stream); close(sockfd); return; } } set_mod_record(mod, buf); fclose(stream); close(sockfd); }
void read_nginx_sys_stats(struct module *mod, char *parameter) { int write_flag = 0, addr_len, domain; int m, sockfd, send, pos; void *addr; char buf[LEN_4096], request[LEN_4096], line[LEN_4096]; FILE *stream = NULL; struct sockaddr_in servaddr; struct sockaddr_un servaddr_un; struct hostinfo hinfo; init_nginx_host_info(&hinfo); if (atoi(parameter) != 0) { hinfo.port = atoi(parameter); } struct stats_nginx_sys st_nginx; memset(&st_nginx, 0, sizeof(struct stats_nginx_sys)); if (*hinfo.host == '/') { addr = &servaddr_un; addr_len = sizeof(servaddr_un); bzero(addr, addr_len); domain = AF_LOCAL; servaddr_un.sun_family = AF_LOCAL; strncpy(servaddr_un.sun_path, hinfo.host, sizeof(servaddr_un.sun_path) - 1); } else { addr = &servaddr; addr_len = sizeof(servaddr); bzero(addr, addr_len); domain = AF_INET; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(hinfo.port); inet_pton(AF_INET, hinfo.host, &servaddr.sin_addr); } if ((sockfd = socket(domain, SOCK_STREAM, 0)) == -1) { goto writebuf; } sprintf(request, "GET %s HTTP/1.0\r\n" "User-Agent: taobot\r\n" "Host: %s\r\n" "Accept:*/*\r\n" "Connection: Close\r\n\r\n", hinfo.uri, hinfo.server_name); if ((m = connect(sockfd, (struct sockaddr *) addr, addr_len)) == -1 ) { goto writebuf; } if ((send = write(sockfd, request, strlen(request))) == -1) { goto writebuf; } if ((stream = fdopen(sockfd, "r")) == NULL) { goto writebuf; } while (fgets(line, LEN_4096, stream) != NULL) { if (!strncmp(line, "Crash:", sizeof("Crash:") - 1)) { sscanf(line, "Crash: %llu", &st_nginx.crash); write_flag = 1; } else { ; } } writebuf: if (stream) { fclose(stream); } if (sockfd != -1) { close(sockfd); } if (write_flag) { pos = sprintf(buf, "%lld", st_nginx.crash); buf[pos] = '\0'; set_mod_record(mod, buf); } }
void read_nginx_live_stats(struct module *mod, char *parameter) { int i,addr_len, domain, m, sockfd, send, pos = 0; char buf[LEN_1M], request[LEN_4096], line[LEN_4096]; unsigned long long online = 0, online_history = 0, up_flow = 0; unsigned long long down_flow = 0, fmtime = 0, drop_frame = 0; char *p; void *addr; FILE *stream = NULL; struct sockaddr_in servaddr; struct sockaddr_un servaddr_un; struct hostinfo hinfo; struct stats_nginx_live stat; /* get peer info */ init_nginx_host_info(&hinfo); if (*hinfo.host == '/') { addr = &servaddr_un; addr_len = sizeof(servaddr_un); bzero(addr, addr_len); domain = AF_LOCAL; servaddr_un.sun_family = AF_LOCAL; strncpy(servaddr_un.sun_path, hinfo.host, sizeof(servaddr_un.sun_path) - 1); } else { addr = &servaddr; addr_len = sizeof(servaddr); bzero(addr, addr_len); domain = AF_INET; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(hinfo.port); inet_pton(AF_INET, hinfo.host, &servaddr.sin_addr); } /* send request */ if ((sockfd = socket(domain, SOCK_STREAM, 0)) == -1) { return; } sprintf(request, "GET %s HTTP/1.0\r\n" "User-Agent: taobot\r\n" "Host: %s\r\n" "Accept:*/*\r\n" "Connection: Close\r\n\r\n", hinfo.uri, hinfo.server_name); if ((m = connect(sockfd, (struct sockaddr *) addr, addr_len)) == -1 ) { close(sockfd); return; } if ((send = write(sockfd, request, strlen(request))) == -1) { close(sockfd); return; } /* read & parse request */ if ((stream = fdopen(sockfd, "r")) == NULL) { close(sockfd); return; } memset(&stat, 0, sizeof(struct stats_nginx_live)); while (fgets(line, LEN_4096, stream) != NULL) { if ((p = strstr(line, "fm_time")) == NULL) { continue; } if (sscanf(p, "fm_time:%llu drop_frame:%llu online:%llu online_history:%llu down_flow:%llu up_flow:%llu", &fmtime, &drop_frame, &online, &online_history, &down_flow, &up_flow) != 6) { continue; } stat.online += online; stat.fmdata += fmtime; stat.dropfr += drop_frame; stat.olhstr += online_history; stat.downfl += down_flow; stat.upflow += up_flow; } pos += snprintf(buf + pos, LEN_1M - pos, "%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld", stat.online, stat.olhstr, stat.olvary, stat.upflow, stat.uspeed, stat.downfl, stat.dspeed, stat.fmtime, stat.fmdata, stat.dropfr); if (strlen(buf) >= LEN_1M - 1) { fclose(stream); close(sockfd); return; } set_mod_record(mod, buf); fclose(stream); close(sockfd); }
static void read_nginx_domain_ups_stats(struct module *mod, char *parameter) { int i, addr_len, domain, m, sockfd, send, pos = 0; char buf[LEN_1M], request[LEN_4096], line[LEN_4096]; char *p; void *addr; FILE *stream = NULL; struct sockaddr_in servaddr; struct sockaddr_un servaddr_un; struct hostinfo hinfo; struct stats_nginx_domain total_stat, stat; unsigned long long d; /* get peer info */ init_nginx_host_info(&hinfo); if (*hinfo.host == '/') { addr = &servaddr_un; addr_len = sizeof(servaddr_un); bzero(addr, addr_len); domain = AF_LOCAL; servaddr_un.sun_family = AF_LOCAL; strncpy(servaddr_un.sun_path, hinfo.host, sizeof(servaddr_un.sun_path) - 1); } else { addr = &servaddr; addr_len = sizeof(servaddr); bzero(addr, addr_len); domain = AF_INET; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(hinfo.port); inet_pton(AF_INET, hinfo.host, &servaddr.sin_addr); } /* send request */ if ((sockfd = socket(domain, SOCK_STREAM, 0)) == -1) { return; } sprintf(request, "GET %s HTTP/1.0\r\n" "User-Agent: taobot\r\n" "Host: %s\r\n" "Accept:*/*\r\n" "Connection: Close\r\n\r\n", hinfo.uri, hinfo.server_name); if ((m = connect(sockfd, (struct sockaddr *) addr, addr_len)) == -1 ) { return; } if ((send = write(sockfd, request, strlen(request))) == -1) { return; } /* read & parse request */ if ((stream = fdopen(sockfd, "r")) == NULL) { close(sockfd); return; } memset(&total_stat, 0, sizeof(struct stats_nginx_domain)); while (fgets(line, LEN_4096, stream) != NULL) { if ((p = strchr(line, ',')) == NULL) { continue; } *p++ = '\0'; /* stat.domain terminating null */ memset(&stat, 0, sizeof(struct stats_nginx_domain)); if (sscanf(p, "%llu,%llu,%llu,%llu," /* 4 */ "%llu,%llu,%llu,%llu,%llu,%llu," /* 4 + 6 = 10 */ "%llu,%llu,%llu,", /* 10 + 3 = 13: ureq, urt, utries */ &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &stat.reqs, &stat.rt, &stat.tries) != 13) { continue; } /* skip 27 fields */ for (i = 0; *p != '\0'; p++) { if (*p == ',') { i++; } if (i == 27) { break; } } if (i != 27) { continue; } p++; /* skip `,' */ /* up4xx, up5xx, fbt, ufbt, ups_response_length */ if (sscanf(p, "%llu,%llu,%llu,%llu,%llu", &stat.n4XX, &stat.n5XX, &stat.fbt, &stat.ufbt, &stat.traffic) != 5) { continue; } /* sum */ total_stat.traffic += stat.traffic; total_stat.reqs += stat.reqs; total_stat.n4XX += stat.n4XX; total_stat.n5XX += stat.n5XX; total_stat.tries += stat.tries; total_stat.rt += stat.rt; total_stat.fbt += stat.fbt; total_stat.ufbt += stat.ufbt; } pos = sprintf(buf, "%lld,%lld,%lld,%lld,%lld,%lld,%lld,%lld", total_stat.traffic, total_stat.reqs, total_stat.tries, total_stat.n4XX, total_stat.n5XX, total_stat.rt, total_stat.fbt, total_stat.ufbt); buf[pos] = '\0'; set_mod_record(mod, buf); fclose(stream); close(sockfd); }
void read_nginx_domain_stats(struct module *mod, char *parameter) { int addr_len, domain, m, sockfd, send, pos = 0; char buf[LEN_4096], request[LEN_4096], line[LEN_4096]; char *p; void *addr; FILE *stream = NULL; struct sockaddr_in servaddr; struct sockaddr_un servaddr_un; struct hostinfo hinfo; struct stats_nginx stat; /* get peer info */ init_nginx_host_info(&hinfo); if (parameter && atoi(parameter) != 0) { hinfo.port = atoi(parameter); } if (*hinfo.host == '/') { addr = &servaddr_un; addr_len = sizeof(servaddr_un); bzero(addr, addr_len); domain = AF_LOCAL; servaddr_un.sun_family = AF_LOCAL; strncpy(servaddr_un.sun_path, hinfo.host, sizeof(servaddr_un.sun_path) - 1); } else { addr = &servaddr; addr_len = sizeof(servaddr); bzero(addr, addr_len); domain = AF_INET; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(hinfo.port); inet_pton(AF_INET, hinfo.host, &servaddr.sin_addr); } /* send request */ if ((sockfd = socket(domain, SOCK_STREAM, 0)) == -1) { return; } sprintf(request, "GET %s HTTP/1.0\r\n" "User-Agent: taobot\r\n" "Host: %s\r\n" "Accept:*/*\r\n" "Connection: Close\r\n\r\n", hinfo.uri, hinfo.server_name); if ((m = connect(sockfd, (struct sockaddr *) addr, addr_len)) == -1 ) { return; } if ((send = write(sockfd, request, strlen(request))) == -1) { return; } /* read & parse request */ if ((stream = fdopen(sockfd, "r")) == NULL) { close(sockfd); return; } while (fgets(line, LEN_4096, stream) != NULL) { if ((p = strchr(line, ',')) == NULL) { continue; } *p++ = '\0'; /* stat.domain terminating null */ if (sscanf(p, "%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu", &stat.nbytesin, &stat.nbytesout, &stat.nconn, &stat.nreq, &stat.n2XX, &stat.n3XX, &stat.n4XX, &stat.n5XX, &stat.nother, &stat.rt) != 10) { continue; } stat.domain = line; pos += sprintf(buf + pos, "%s=%lld,%lld,%lld,%lld,%lld,%lld,%lld" ITEM_SPLIT, stat.domain, stat.nconn, stat.nreq, stat.n2XX, stat.n3XX, stat.n4XX, stat.n5XX, stat.rt); } buf[pos] = '\0'; set_mod_record(mod, buf); fclose(stream); close(sockfd); }