Hi Paolo,

On Thu, 5 Jun 2014, Paolo Lucente wrote:

DEBUG ( default/amqp ): publishing [E=pmacct RK=acct DM=0]: {"timestamp_start": "2014-06-03 22:42:00.202820", "ip_dst": "196.223.145.xxx", "ip_proto": "tcp", "tos": 0, "ip_src": "86.30.131.xxx", "bytes": 142, "port_dst": 36363, "packets": 1, "port_src": 2201, "timestamp_end": "1970-01-01 03:00:00.0"}

Is this a bug? Would it be easy to fix?

This is not a bug. This is result of the fact a single packet has a single timestamp (or two coinciding) hence only one of the two values, timestamp_start, is populated.

OK sorry, I found that out by rereading CONFIG-KEYS while trying to work out if there was any way to get the bucket start and end times into the JSON output.

Try to:

* capture your own traffic with pmacctd attaching to it a
 nfprobe plugin, the NetFlow/IPFIX probe plugin. Set the
 export to localhost.

* on localhost you bind nfacctd that listens for NetFlow/IPFIX
 packets (generated by pmacctd/nfprobe) and writes wherever you
 want to like with the aggregation you like (this time you will
 see both timestamp_start and timestamp_end populated - as a
 result of the flow-aware cache of nfprobe).

This is the slightly more involved solution i was proposing, which i don't know if you like or not (definitely good for a proof of concept).

What I have done so far is to modify pmacctd to send two extra timestamps: the start and end times of the history bucket. This is working well for me and it would be great to have something like this integrated into pmacct. Patch attached.

I also had to modify sql_history to allow it to be set to 1 second intervals, which was previously blocked by a warning. I've included this part in the attached patch as well.

Finally I changed the timestamps into GMT instead of local time.

Cheers, Chris.
--
Aptivate | http://www.aptivate.org | Phone: +44 1223 967 838
Citylife House, Sturton Street, Cambridge, CB1 2QF, UK

Aptivate is a not-for-profit company registered in England and Wales
with company number 04980791.
Only in pmacct-1.5.0rc3-chris: config.cache
Only in pmacct-1.5.0rc3-chris: config.log
Only in pmacct-1.5.0rc3-chris: config.status
Only in pmacct-1.5.0rc3-chris: Makefile
Only in pmacct-1.5.0rc3-chris/src: acct.o
Only in pmacct-1.5.0rc3-chris/src: addr.o
diff -ru pmacct-1.5.0rc3/src/amqp_plugin.c pmacct-1.5.0rc3-chris/src/amqp_plugin.c
--- pmacct-1.5.0rc3/src/amqp_plugin.c	2014-03-24 02:59:04.000000000 +0300
+++ pmacct-1.5.0rc3-chris/src/amqp_plugin.c	2014-06-04 14:50:00.706672411 +0300
@@ -142,7 +142,7 @@
 
     if (config.sql_history) {
       while (now > (basetime.tv_sec + timeslot)) {
-	new_basetime.tv_sec = basetime.tv_sec;
+        new_basetime.tv_sec = basetime.tv_sec;
         basetime.tv_sec += timeslot;
         if (config.sql_history == COUNT_MONTHLY)
           timeslot = calc_monthly_timeslot(basetime.tv_sec, config.sql_history_howmany, ADD);
@@ -341,7 +341,7 @@
     json_str = compose_json(config.what_to_count, config.what_to_count_2, queue[j]->flow_type,
                          &queue[j]->primitives, pbgp, pnat, pmpls, pcust, queue[j]->bytes_counter,
 			 queue[j]->packet_counter, queue[j]->flow_counter, queue[j]->tcp_flags,
-			 &queue[j]->basetime);
+			 &queue[j]->basetime, &new_basetime);
 
     if (json_str) {
       if (is_routing_key_dyn) amqp_handle_routing_key_dyn_strings(config.sql_table, SRVBUFLEN, orig_amqp_routing_key,
diff -ru pmacct-1.5.0rc3/src/cfg_handlers.c pmacct-1.5.0rc3-chris/src/cfg_handlers.c
--- pmacct-1.5.0rc3/src/cfg_handlers.c	2014-03-19 01:27:42.000000000 +0300
+++ pmacct-1.5.0rc3-chris/src/cfg_handlers.c	2014-06-04 13:29:00.490676835 +0300
@@ -3564,6 +3564,7 @@
 
   k = atoi(value);
   if (k > 0) {
+    /*
     if (*mu == COUNT_SECONDLY) {
       if (k % 60) {
         Log(LOG_WARNING, "WARN ( %s ): Ignoring invalid time value: %d (residual secs afters conversion in mins)\n", filename, k);
@@ -3574,6 +3575,7 @@
 	*mu = COUNT_MINUTELY;
       }
     }
+    */
     *howmany = k;
   }
   else {
diff -ru pmacct-1.5.0rc3/src/plugin_common.c pmacct-1.5.0rc3-chris/src/plugin_common.c
--- pmacct-1.5.0rc3/src/plugin_common.c	2014-03-26 19:32:46.000000000 +0300
+++ pmacct-1.5.0rc3-chris/src/plugin_common.c	2014-06-04 14:21:16.874628272 +0300
@@ -612,7 +612,8 @@
   basetime.tv_sec = now;
   basetime.tv_usec = 0;
 
-  if (config.sql_history == COUNT_MINUTELY) timeslot = config.sql_history_howmany*60;
+  if (config.sql_history == COUNT_SECONDLY) timeslot = config.sql_history_howmany;
+  else if (config.sql_history == COUNT_MINUTELY) timeslot = config.sql_history_howmany*60;
   else if (config.sql_history == COUNT_HOURLY) timeslot = config.sql_history_howmany*3600;
   else if (config.sql_history == COUNT_DAILY) timeslot = config.sql_history_howmany*86400;
   else if (config.sql_history == COUNT_WEEKLY) timeslot = config.sql_history_howmany*86400*7;
diff -ru pmacct-1.5.0rc3/src/util.c pmacct-1.5.0rc3-chris/src/util.c
--- pmacct-1.5.0rc3/src/util.c	2014-03-16 19:20:44.000000000 +0300
+++ pmacct-1.5.0rc3-chris/src/util.c	2014-06-04 19:29:59.318621575 +0300
@@ -26,6 +26,7 @@
 #include "pmacct-data.h"
 #include "ip_flow.h"
 #include "classifier.h"
+#include "plugin_common.h"
 #ifdef WITH_JANSSON
 #include <jansson.h>
 #endif
@@ -1045,8 +1046,8 @@
   if (a->tv_sec == b->tv_sec) {
     if (a->tv_usec > b->tv_usec) return 1;
     if (a->tv_usec < b->tv_usec) return -1;
-    if (a->tv_usec == b->tv_usec) return 0;
   }
+  return 0;
 }
 
 /*
@@ -1597,7 +1598,7 @@
 char *compose_json(u_int64_t wtc, u_int64_t wtc_2, u_int8_t flow_type, struct pkt_primitives *pbase,
 		  struct pkt_bgp_primitives *pbgp, struct pkt_nat_primitives *pnat, struct pkt_mpls_primitives *pmpls,
 		  char *pcust, pm_counter_t bytes_counter, pm_counter_t packet_counter, pm_counter_t flow_counter,
-		  u_int32_t tcp_flags, struct timeval *basetime)
+		  u_int32_t tcp_flags, struct timeval *timeslot_start,  struct timeval *timeslot_end)
 {
   char src_mac[18], dst_mac[18], src_host[INET6_ADDRSTRLEN], dst_host[INET6_ADDRSTRLEN], ip_address[INET6_ADDRSTRLEN];
   char rd_str[SRVBUFLEN], misc_str[SRVBUFLEN], *as_path, *bgp_comm, empty_string[] = "", *tmpbuf;
@@ -2000,20 +2001,16 @@
     }
   }
 
-  if (basetime && config.sql_history) {
-    struct timeval tv;
-
-    tv.tv_sec = basetime->tv_sec;
-    tv.tv_usec = 0;
-    compose_timestamp(tstamp_str, SRVBUFLEN, &tv, FALSE);
-    kv = json_pack("{ss}", "stamp_inserted", tstamp_str);
+  if (config.sql_history) {
+    compose_timestamp(tstamp_str, SRVBUFLEN, &basetime, FALSE);
+    kv = json_pack("{ss}", "timeslot_start", tstamp_str);
     json_object_update_missing(obj, kv);
     json_decref(kv);
 
-    tv.tv_sec = time(NULL);
-    tv.tv_usec = 0;
+    struct timeval tv = basetime;
+    tv.tv_sec += timeslot;
     compose_timestamp(tstamp_str, SRVBUFLEN, &tv, FALSE);
-    kv = json_pack("{ss}", "stamp_updated", tstamp_str);
+    kv = json_pack("{ss}", "timeslot_end", tstamp_str);
     json_object_update_missing(obj, kv);
     json_decref(kv);
   }
@@ -2058,7 +2055,7 @@
   struct tm *time2;
 
   time1 = tv->tv_sec;
-  time2 = localtime(&time1);
+  time2 = gmtime(&time1);
   strftime(tmpbuf, SRVBUFLEN, "%Y-%m-%d %H:%M:%S", time2);
 
   if (usec) snprintf(buf, buflen, "%s.%u", tmpbuf, tv->tv_usec);
Only in pmacct-1.5.0rc3-chris/src: .util.c.swp
diff -ru pmacct-1.5.0rc3/src/util.h pmacct-1.5.0rc3-chris/src/util.h
--- pmacct-1.5.0rc3/src/util.h	2013-11-08 05:43:01.000000000 +0300
+++ pmacct-1.5.0rc3-chris/src/util.h	2014-06-04 14:46:31.726667060 +0300
@@ -99,7 +99,8 @@
 EXT char *compose_json(u_int64_t, u_int64_t, u_int8_t, struct pkt_primitives *,
 		      struct pkt_bgp_primitives *, struct pkt_nat_primitives *,
 		      struct pkt_mpls_primitives *, char *, pm_counter_t,
-		      pm_counter_t, pm_counter_t, u_int32_t, struct timeval *);
+		      pm_counter_t, pm_counter_t, u_int32_t, struct timeval *,
+		      struct timeval *);
 EXT void compose_timestamp(char *, int, struct timeval *, int);
 
 EXT struct packet_ptrs *copy_packet_ptrs(struct packet_ptrs *);
Only in pmacct-1.5.0rc3-chris/src: .util.h.swp
Only in pmacct-1.5.0rc3-chris/src: util.o
Only in pmacct-1.5.0rc3-chris/src: xflow_status.o
_______________________________________________
pmacct-discussion mailing list
http://www.pmacct.net/#mailinglists

Reply via email to