Exemple #1
0
static TIMESTAMP collector_write(OBJECT *obj)
{
	struct collector *my = OBJECTDATA(obj,struct collector);
	char ts[64];
	if (my->format==0)
	{
		//time_t t = (time_t)(my->last.ts*TS_SECOND);
		//strftime(ts,sizeof(ts),timestamp_format, gmtime(&t));

		DATETIME dt;
		gl_localtime(my->last.ts, &dt);
		gl_strtime(&dt, ts, sizeof(ts));
	}
	else
		sprintf(ts,"%" FMT_INT64 "d", my->last.ts);
	if ((my->limit>0 && my->samples>my->limit) /* limit reached */
		|| write_collector(my,ts,my->last.value)==0) /* write failed */
	{
		if (my->ops){
			close_collector(my);
		} else {
			gl_error("collector_write: no TAPEOP structure when closing the tape");
		}
		my->status = TS_DONE;
	}
	else
		my->samples++;
	return TS_NEVER;
}
Exemple #2
0
void FzController::close(void) {

   std::cout << INFOTAG << "FzController: closing application" << std::endl; 

   close_collector();
   close_rcs();
   close_cli();
#ifdef WEBLOG_ENABLED
   close_weblog();
#endif

   context.close();
}
Exemple #3
0
EXPORT TIMESTAMP sync_collector(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
{
	struct collector *my = OBJECTDATA(obj,struct collector);
	typedef enum {NONE='\0', LT='<', EQ='=', GT='>'} COMPAREOP;
	COMPAREOP comparison;
	char1024 buffer = "";
	
	if(my->status == TS_DONE){
		return TS_NEVER;
	}

	/* connect to property */
	if (my->aggr==NULL)
		my->aggr = link_aggregates(my->property,my->group);

	/* read property */
	if (my->aggr==NULL)
	{
		sprintf(buffer,"'%s' contains an aggregate that is not found in the group '%s'", my->property, my->group);
		my->status = TS_ERROR;
		goto Error;
	}
	
	if((my->status == TS_OPEN) && (t0 > obj->clock)){
		obj->clock = t0;
		if((my->interval > 0) && (my->last.ts < t0) && (my->last.value[0] != 0)){
			collector_write(obj);
			//my->last.ts = t0;
			my->last.value[0] = 0;
		}
	}

	//if(my->aggr != NULL && (my->aggr = link_aggregates(my->property,my->group)),read_aggregates(my->aggr,buffer,sizeof(buffer))==0)
	if(my->aggr != NULL && (my->interval == 0 || my->interval == -1)){
		if(read_aggregates(my->aggr,buffer,sizeof(buffer))==0)
		{
			sprintf(buffer,"unable to read aggregate '%s' of group '%s'", my->property, my->group);
			close_collector(my);
			my->status = TS_ERROR;
		}
	}

	if(my->aggr != NULL && my->interval > 0){
		if((t0 >= my->last.ts + my->interval) || (t0 == my->last.ts)){
			if(read_aggregates(my->aggr,buffer,sizeof(buffer))==0){
				sprintf(buffer,"unable to read aggregate '%s' of group '%s'", my->property, my->group);
				close_collector(my);
				my->status = TS_ERROR;
			}
			my->last.ts = t0;
		}
	}

	/* check trigger, if any */
	comparison = (COMPAREOP)my->trigger[0];
	if (comparison!=NONE)
	{
		int desired = comparison==LT ? -1 : (comparison==EQ ? 0 : (comparison==GT ? 1 : -2));

		/* if not trigger or can't get access */
		int actual = strcmp(buffer,my->trigger+1);
		if (actual!=desired || (my->status==TS_INIT && !collector_open(obj))){
			/* better luck next time */
			return (my->interval==0 || my->interval==-1) ? TS_NEVER : t0+my->interval;
		}
	}
	else if (my->status==TS_INIT && !collector_open(obj)){
		close_collector(my);
		return TS_NEVER;
	}

	if(my->last.ts < 1 && my->interval != -1){
		my->last.ts = t0;
	}

	/* write tape */
	if(my->status == TS_OPEN){	
		if(my->interval == 0 /* sample on every pass */
			|| ((my->interval == -1) && my->last.ts != t0 && strcmp(buffer, my->last.value) != 0) /* sample only when value changes */
			){
			strncpy(my->last.value, buffer, sizeof(my->last.value));
			my->last.ts = t0;
			collector_write(obj);
		} else if(my->interval > 0 && my->last.ts == t0){
			strncpy(my->last.value, buffer, sizeof(my->last.value));
		}
	}
Error:
	if (my->status==TS_ERROR)
	{
		gl_error("collector %d %s\n",obj->id, buffer);
		my->status=TS_DONE;
		return 0; /* failed */
	}

	return (my->interval==0 || my->interval==-1) ? TS_NEVER : my->last.ts+my->interval;
}