/**
 * Called by the logger timer thread. Dumps info using msg_stat
 */
void IpfixAggregator::stats()
{
	int i;

	pthread_mutex_lock(&mutex);
	for (i = 0; i < rules->count; i++) {
		int j;
		uint32_t usedBuckets = 0;
		uint32_t usedHeads = 0;
		uint32_t longestSpillchain = 0;
		uint32_t avgAge = 0;

		Hashtable* ht = rules->rule[i]->hashtable;
		msg_stat("Concentrator: Rule %2d: Records: %6d received, %6d sent", i, ht->recordsReceived, ht->recordsSent);
		ht->recordsReceived = 0;
		ht->recordsSent = 0;

		for (j = 0; j < HASHTABLE_SIZE; j++) {
			Hashtable::Bucket* hb = ht->buckets[j];
			if (hb) usedHeads++;

			uint32_t bucketsInSpillchain = 0;
			while (hb) {
				avgAge += time(0) - (hb->forceExpireTime - ht->maxBufferTime);
				usedBuckets++;
				bucketsInSpillchain++;
				hb = hb->next;
			}
			if (bucketsInSpillchain > longestSpillchain) longestSpillchain = bucketsInSpillchain;
		}

		msg_stat("Concentrator: Rule %2d: Hashbuckets: %6d used, %6d at head, %6d max chain, %6d avg age", i, usedBuckets, usedHeads, longestSpillchain, usedBuckets?(avgAge / usedBuckets):0);
	}
	pthread_mutex_unlock(&mutex);
}
/**
 * Called by the logger timer thread. Dumps info using msg_stat
 */
void IpfixReceiver::stats()
{
	msg_stat("Concentrator: IpfixReceiver: %6d records received", receivedRecords);
	receivedRecords = 0;
}
Beispiel #3
0
void do_recv_messgae_from_arbiter()
{
    char buff[65535];
    struct sockaddr_in recv_control_addr;
    socklen_t recv_control_addr_len = sizeof(recv_control_addr);
    int len = 0;
    //struct msg_st *mesg = NULL;
    char buf[500];
    int ret = 0;
    struct msg_st mesg;
    int msgid = 0;
    uint32_t  count_stat = 0;


    //char buf[512];
    char file_buf[512];
    FILE *fp = NULL; 
    fp = fopen(DATA_STREAM_FILE_NAME,"w+");
    if(NULL == fp)
    {
        marbit_send_log(INFO,"failed to open file %s\n", DATA_STREAM_FILE_NAME);
        return;
    }


    int  shmid = 0;
    skbstat_t    *skbstat = NULL;

#if 1
     struct msqid_ds msg_ginfo,msg_sinfo;
     msg_stat(msgid,msg_ginfo);
     msg_sinfo.msg_perm.uid=8;//just a try
     msg_sinfo.msg_perm.gid=8;//
     msg_sinfo.msg_qbytes=16384000;
    //此处验证超级用户可以更改消息队列的缺省msg_qbytes
#endif

    key_t key;

    key = ftok(KEYPATH, KEYPROJ);
    if (key<0) 
    {
       marbit_send_log(INFO,"ftok()");
       return;
   }

    msgid = msgget(key, IPC_CREAT|0600);
    if (msgid<0) 
    {
        marbit_send_log(INFO,"msgget() error ");
        return ;
    }

     if ( (shmid = shmget(STAT_SHM_KEY, SHM_SIZE, SHM_MODE)) < 0)
    {
        marbit_send_log(INFO,"shmget");
        return;
    }

    if ( ( skbstat = (skbstat_t *)shmat(shmid, NULL, 0)) == (void *) -1)
    {
        marbit_send_log(INFO, "shmat");
        return;
    }
    
    skbstat->web_msgid = msgid;
    skbstat->web_mesg_flag = 1;
    
    marbit_send_log(INFO,"msgid = %d\n", msgid);
    marbit_send_log(INFO,"set shm web_mesg_flag = 1\n");

    time_t begin_time = time(NULL);
    time_t finish_time = 0;
    marbit_send_log(INFO,"begin_time = %d\n", begin_time);
    
    while (1) 
    {
        if(1 == STREAM_MESG_NUM_LIMIT_FLAG)
        {
            if(count_stat >= STREAM_MESG_NUM_LIMIT_MAX)
            {
                marbit_send_log(INFO, "count_stat[%d] >= STREAM_MESG_NUM_LIMIT_MAX[%d], just exit\n",count_stat, STREAM_MESG_NUM_LIMIT_MAX);
                break;  
            }
        }

        if(1 == g_force_recv_from_arbiter_shutdown)
        {
            marbit_send_log(INFO,"g_force_recv_from_arbiter_shutdown = 1, break\n");
            break;
        }
        
        ret = msgrcv(msgid, &mesg, sizeof(mesg)-sizeof(long), 0, IPC_NOWAIT);
        if (ret<0) 
        {   
            if(errno == ENOMSG)
            {
                continue;
            }
            
            marbit_send_log(ERROR,"msgrcv() error errno = %d\n", errno);
            
            break;
        }
        
         if(1 == mesg.finish_flag)
        {
            count_stat++;
            
            marbit_send_log(INFO,"recv message from arbiter finished! %u\n", count_stat);

            finish_time = time(NULL);
            marbit_send_log(INFO,"finish_time = %d\n", finish_time);

            
            break;  
        }
       
        else //if(0 == mesg->finish_flag)
        {               
        #if 1
            fprintf(fp, "%-15u,%-15u,%-15u,%-15u,%-15u,%-15u,%-15u,%-15u,%-15u,%-15u\n",
                    mesg.ip_src, mesg.port_src, 
                    mesg.ip_dst , mesg.port_dst,
                    mesg.proto,  mesg.proto_mark,
                    mesg.up_bytes, mesg.down_bytes, 
                    mesg.duration_time, mesg.finish_flag);
        #endif
            count_stat++;
         }   

    }
    
    time_t end_time = time(NULL);
    marbit_send_log(INFO,"end_time = %d\n", end_time);
    
    msgctl(msgid, IPC_RMID, NULL);

    fclose(fp);

    return;