示例#1
0
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);
}
示例#2
0
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);
    }
}
示例#3
0
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);
}
示例#4
0
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);
}
示例#5
0
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);
}