/*************************************************************************//** * * Copyright © 2019 AT&T Intellectual Property. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************/ #include #include #include #include #include #include #include #include #include "jsmn.h" #include "evel.h" #define BUFSIZE 128 #define MAX_BUFFER_SIZE 4096 #define MAX_TOKENS 1000 #define MAX_INTERFACES 40 void *MeasThread(void *threadarg); typedef struct dummy_vpp_metrics_struct { int curr_bytes_in; int curr_bytes_out; int curr_packets_in; int curr_packets_out; int last_bytes_in; int last_bytes_out; int last_packets_in; int last_packets_out; } vpp_metrics_struct; typedef struct linkstat { char linkname[32]; char linkdescr[64]; char linkmode[64]; int speedmbps; }LINKSTAT; vpp_metrics_struct meas_intfstat[MAX_INTERFACES]; LINKSTAT meas_linkstat[MAX_INTERFACES]; unsigned long long epoch_start = 0; int format_val_params(KEYVALRESULT * keyValArray, int numElements, const char *replace, const char *search) { char *sp; int i =0; int search_len; int replace_len; int tail_len; for (i=0; i| | \n", argv[0]); fprintf(stderr, "OR\n"); fprintf(stderr, "Usage: %s | \n", argv[0]); exit(-1); } /**************************************************************************/ /* Initialize */ /**************************************************************************/ if(evel_initialize(fqdn, /* FQDN */ port, /* Port */ fqdn2, /* Backup FQDN */ port2, /* Backup port */ NULL, /* optional path */ NULL, /* optional topic */ 100, /* Ring Buffer size */ 0, /* HTTPS? */ NULL, /* cert file */ NULL, /* key file */ NULL, /* ca info */ NULL, /* ca file */ 0, /* verify peer */ 0, /* verify host */ "sample1", /* Username */ "sample1", /* Password */ "sample1", /* Username2 */ "sample1", /* Password2 */ NULL, /* Source ip */ NULL, /* Source ip2 */ EVEL_SOURCE_VIRTUAL_MACHINE, /* Source type */ "vFirewall", /* Role */ 1)) /* Verbosity */ { fprintf(stderr, "\nFailed to initialize the EVEL library!!!\n"); exit(-1); } else { printf("\nInitialization completed\n"); } /* Initialize and set thread detached attribute */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); printf("Main:Creating thread \n"); rc = pthread_create(&meas_thread, NULL, MeasThread, &i); if (rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } printf("Main:Created Meas thread \n"); pthread_join(meas_thread, NULL); evel_terminate(); printf("Terminated\n"); return 0; } void *MeasThread(void *mainMeas) { EVEL_ERR_CODES evel_rc = EVEL_SUCCESS; EVENT_MEASUREMENT * vpp_m = NULL; MEASUREMENT_CPU_USE *cpu_use = NULL; EVENT_HEADER* vpp_m_header = NULL; int bytes_in; int bytes_out; int packets_in; int packets_out; unsigned long long epoch_now; int request_rate = 0; struct timeval time_val; MEASUREMENT_VNIC_PERFORMANCE * vnic_performance = NULL; char event_id1[10] = "mvfs"; char event_id2[15] = {0}; char event_id[BUFSIZE] = {0}; int meas_event_id = 0; int numToken; jsmntok_t tokens[MAX_TOKENS]; char js[MAX_BUFFER_SIZE]; jsmn_parser p; char ch[BUFSIZE]; int ret = 0; char eName[BUFSIZE]; char eType[BUFSIZE]; char nfcCode[BUFSIZE]; char nfCode[BUFSIZE]; char prio[BUFSIZE]; char reportEId[BUFSIZE]; char reportEName[BUFSIZE]; char srcId[BUFSIZE]; char srcName[BUFSIZE]; char cpuId[BUFSIZE]; int priority; char hostname[BUFSIZE]; int meas_interval; ARRAYVAL intfArray[MAX_INTERFACES]; KEYVALRESULT keyValResultArray[32]; KEYVALRESULT keyValResultArray2[32]; KEYVALRESULT vnicCommandArray[32]; KEYVALRESULT cpuUsageCommandArray[32]; int numInitCommands = 0; int numVnicCommands = 0; int numCpuUsageCommands = 0; int linkCount = 0; double usage=0.0; double cpuIdle=0.0; double cpuSystem=0.0; double cpuUser=0.0; double intrpt; double nice; double softirq; double steal; double wait; int i = 0; memset(hostname, 0, BUFSIZE); gethostname(hostname, BUFSIZE); printf("MeasThread::The hostname is %s\n", hostname); sleep(1); printf("MeasThread::Running Meas thread \n"); fflush(stdout); memset(&intfArray[0],0,(sizeof(ARRAYVAL) * MAX_INTERFACES)); memset(&keyValResultArray[0],0,(sizeof(KEYVALRESULT) * 32)); memset(js, 0, MAX_BUFFER_SIZE); memset(ch, 0, BUFSIZE); memset(&meas_intfstat[0],0,(sizeof(vpp_metrics_struct)* MAX_INTERFACES)); memset(&meas_linkstat[0],0,(sizeof(LINKSTAT) * MAX_INTERFACES)); FILE * file = fopen("meas_config.json", "r"); while((fgets(ch, (BUFSIZE-1), file)) !=NULL) { strcat(js, ch); memset(ch, 0, BUFSIZE); } // printf("MeasThread::the file content is \n %s \n", js); jsmn_init(&p); numToken = jsmn_parse(&p, js, strlen(js), tokens, MAX_TOKENS); printf("MeasThread::count-%d\n", numToken); // printToken(js,tokens, numToken); ret = getIntToken(js, tokens, numToken, "measurementInterval", "tmp_directParameters", &meas_interval); if (ret != 0) { printf("MeasThread::The parameter measurementInterval is not defined, defaulted to 60 seconds\n"); meas_interval = 60; } ret = getArrayTokens(js, tokens, numToken, "tmp_device", "tmp_directParameters", intfArray, &linkCount); printf("MeasThread::Array link count is %d\n", linkCount); /* Copy the link information */ for(i=0;i 0) { bytes_in = meas_intfstat[i].curr_bytes_in - meas_intfstat[i].last_bytes_in; } else { bytes_in = 0; } if(meas_intfstat[i].curr_bytes_out - meas_intfstat[i].last_bytes_out > 0) { bytes_out = meas_intfstat[i].curr_bytes_out - meas_intfstat[i].last_bytes_out; } else { bytes_out = 0; } if(meas_intfstat[i].curr_packets_in - meas_intfstat[i].last_packets_in > 0) { packets_in = meas_intfstat[i].curr_packets_in - meas_intfstat[i].last_packets_in; } else { packets_in = 0; } if(meas_intfstat[i].curr_packets_out - meas_intfstat[i].last_packets_out > 0) { packets_out = meas_intfstat[i].curr_packets_out - meas_intfstat[i].last_packets_out; } else { packets_out = 0; } vnic_performance = (MEASUREMENT_VNIC_PERFORMANCE *)evel_measurement_new_vnic_performance(meas_linkstat[i].linkname, "true"); evel_meas_vnic_performance_add(vpp_m, vnic_performance); evel_vnic_performance_rx_total_pkt_delta_set(vnic_performance, packets_in); evel_vnic_performance_tx_total_pkt_delta_set(vnic_performance, packets_out); evel_vnic_performance_rx_octets_delta_set(vnic_performance, bytes_in); evel_vnic_performance_tx_octets_delta_set(vnic_performance, bytes_out); if (strcmp(meas_linkstat[i].linkname, "docker") == 0) { request_rate = measure_traffic(); } } evel_measurement_request_rate_set(vpp_m, request_rate); //evel_get_cpu_stats(vpp_m); memset(&keyValResultArray2[0],0,(sizeof(KEYVALRESULT) * 32)); memset(&cpuUsageCommandArray[0],0,(sizeof(KEYVALRESULT) * 32)); ret = getStringToken(js, tokens, numToken, "cpuIdentifier", "cpuUsage", cpuId, BUFSIZE); if (ret != 0) { printf("MeasThread::Missing parameters - cpuIdentifier is not there in cpuUsage, default to Cpu1\n"); strcpy(cpuId, "Cpu1"); } read_keyVal_params(js, tokens, numToken, "tmp_cpuuse_command", "cpuUsage", keyValResultArray2, &numCpuUsageCommands); memcpy(cpuUsageCommandArray, keyValResultArray2, (sizeof(KEYVALRESULT) * 32)); runCommands(cpuUsageCommandArray, numCpuUsageCommands); cpu_use = evel_measurement_new_cpu_use_add(vpp_m, cpuId, usage); if( cpu_use != NULL ) { /**************************** for(i=0; iheader, epoch_start); evel_last_epoch_set(&vpp_m->header, epoch_now); epoch_start= epoch_now; if(nfcCode != NULL) evel_nfcnamingcode_set(&vpp_m->header, nfcCode); if(nfCode != NULL) evel_nfnamingcode_set(&vpp_m->header, nfCode); evel_reporting_entity_name_set(&vpp_m->header, reportEName); if(reportEId != NULL) evel_reporting_entity_id_set(&vpp_m->header, reportEId); if(srcId != NULL ) evel_source_id_set(&vpp_m->header, srcId); if(srcName!= NULL ) evel_source_name_set(&vpp_m->header, srcName); evel_rc = evel_post_event(vpp_m_header); if(evel_rc == EVEL_SUCCESS) printf("MeasThread::Meas event is correctly sent to the collector!\n"); else printf("MeasThread::Post failed %d (%s)\n", evel_rc, evel_error_string()); } else { printf("MeasThread::Measurement event creation failed (%s)\n", evel_error_string()); } sleep(meas_interval); } /***************************************************************************/ /* Terminate */ /***************************************************************************/ sleep(1); }