From 4e26503ec8585686ae3af5b6fea61285a7b94965 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Thu, 31 Mar 2022 09:53:29 -0700 Subject: [PATCH] Adding deltas. --- openapi/owanalytics.yaml | 61 ++++++++++++++----- src/APStats.cpp | 62 +++++++++++++------- src/RESTObjects/RESTAPI_AnalyticsObjects.cpp | 40 +++++++++++++ src/RESTObjects/RESTAPI_AnalyticsObjects.h | 18 ++++++ 4 files changed, 143 insertions(+), 38 deletions(-) diff --git a/openapi/owanalytics.yaml b/openapi/owanalytics.yaml index db50510..ed5966e 100644 --- a/openapi/owanalytics.yaml +++ b/openapi/owanalytics.yaml @@ -328,6 +328,27 @@ components: type: number tx_duration_pct: type: number + tx_bytes_delta: + type: integer + format: int64 + rx_bytes_delta: + type: integer + format: int64 + tx_packets_delta: + type: integer + format: int64 + rx_packets_delta: + type: integer + format: int64 + tx_failed_delta: + type: integer + format: int64 + tx_retries_delta: + type: integer + format: int64 + tx_duration_delta: + type: integer + format: int64 AveragePoint: type: object @@ -402,22 +423,30 @@ components: tx_packets: type: integer format: int64 - tx_bytes_bw: - type: number - rx_bytes_bw: - type: number - rx_dropped_pct: - type: number - tx_dropped_pct: - type: number - rx_packets_bw: - type: number - tx_packets_bw: - type: number - rx_errors_pct: - type: number - tx_errors_pct: - type: number + tx_bytes_delta: + type: integer + format: int64 + rx_bytes_delta: + type: integer + format: int64 + rx_dropped_delta: + type: integer + format: int64 + tx_dropped_delta: + type: integer + format: int64 + rx_packets_delta: + type: integer + format: int64 + tx_packets_delta: + type: integer + format: int64 + rx_errors_delta: + type: integer + format: int64 + tx_errors_delta: + type: integer + format: int64 RadioTimePoint: type: object diff --git a/src/APStats.cpp b/src/APStats.cpp index 27901e1..f7cc943 100644 --- a/src/APStats.cpp +++ b/src/APStats.cpp @@ -242,14 +242,24 @@ namespace OpenWifi { auto time_lapse = DTP.timestamp - tp_base_.timestamp; if(time_lapse==0) time_lapse = 1; - db_DTP.ap_data.tx_bytes_bw = safe_div(db_DTP.ap_data.tx_bytes - tp_base_.ap_data.tx_bytes, time_lapse); - db_DTP.ap_data.rx_bytes_bw = safe_div(db_DTP.ap_data.rx_bytes - tp_base_.ap_data.rx_bytes, time_lapse); - db_DTP.ap_data.tx_packets_bw = safe_div(db_DTP.ap_data.tx_packets - tp_base_.ap_data.tx_packets, time_lapse); - db_DTP.ap_data.rx_packets_bw = safe_div(db_DTP.ap_data.rx_packets - tp_base_.ap_data.rx_packets, time_lapse); - db_DTP.ap_data.tx_dropped_pct = safe_pct(db_DTP.ap_data.tx_dropped - tp_base_.ap_data.tx_dropped, db_DTP.ap_data.tx_packets); - db_DTP.ap_data.rx_dropped_pct = safe_pct(db_DTP.ap_data.rx_dropped - tp_base_.ap_data.rx_dropped, db_DTP.ap_data.rx_packets); - db_DTP.ap_data.tx_errors_pct = safe_pct(db_DTP.ap_data.tx_errors - tp_base_.ap_data.tx_errors, db_DTP.ap_data.tx_packets); - db_DTP.ap_data.rx_errors_pct = safe_pct(db_DTP.ap_data.rx_errors - tp_base_.ap_data.rx_errors, db_DTP.ap_data.rx_packets); + + db_DTP.ap_data.tx_bytes_delta = db_DTP.ap_data.tx_bytes - tp_base_.ap_data.tx_bytes; + db_DTP.ap_data.rx_bytes_delta = db_DTP.ap_data.rx_bytes - tp_base_.ap_data.rx_bytes; + db_DTP.ap_data.tx_packets_delta = db_DTP.ap_data.tx_packets - tp_base_.ap_data.tx_packets; + db_DTP.ap_data.rx_packets_delta = db_DTP.ap_data.rx_packets - tp_base_.ap_data.rx_packets; + db_DTP.ap_data.tx_dropped_delta = db_DTP.ap_data.tx_dropped - tp_base_.ap_data.tx_dropped; + db_DTP.ap_data.rx_dropped_delta = db_DTP.ap_data.rx_dropped - tp_base_.ap_data.rx_dropped; + db_DTP.ap_data.tx_errors_delta = db_DTP.ap_data.tx_errors - tp_base_.ap_data.tx_errors; + db_DTP.ap_data.rx_errors_delta = db_DTP.ap_data.rx_errors - tp_base_.ap_data.rx_errors; + + db_DTP.ap_data.tx_bytes_bw = safe_div(db_DTP.ap_data.tx_bytes_delta, time_lapse); + db_DTP.ap_data.rx_bytes_bw = safe_div(db_DTP.ap_data.rx_bytes_delta , time_lapse); + db_DTP.ap_data.tx_packets_bw = safe_div(db_DTP.ap_data.tx_packets_delta, time_lapse); + db_DTP.ap_data.rx_packets_bw = safe_div(db_DTP.ap_data.rx_packets_delta, time_lapse); + db_DTP.ap_data.tx_dropped_pct = safe_pct(db_DTP.ap_data.tx_dropped_delta, db_DTP.ap_data.tx_packets); + db_DTP.ap_data.rx_dropped_pct = safe_pct(db_DTP.ap_data.rx_dropped_delta, db_DTP.ap_data.rx_packets); + db_DTP.ap_data.tx_errors_pct = safe_pct(db_DTP.ap_data.tx_errors_delta, db_DTP.ap_data.tx_packets); + db_DTP.ap_data.rx_errors_pct = safe_pct(db_DTP.ap_data.rx_errors_delta, db_DTP.ap_data.rx_packets); for(auto &radio:db_DTP.radio_data) { bool found=false; @@ -276,23 +286,31 @@ namespace OpenWifi { for(auto &association:ssid.associations) { AnalyticsObjects::UETimePoint ue_tp; if(find_ue(association.station, tp_base_.ssid_data, ue_tp) && !new_connection(ue_tp,association)) { - association.tx_bytes_bw = safe_div( association.tx_bytes - ue_tp.tx_bytes , time_lapse ); - association.rx_bytes_bw = safe_div( association.rx_bytes - ue_tp.rx_bytes , time_lapse ); - association.tx_packets_bw = safe_div( association.tx_packets - ue_tp.tx_packets , time_lapse ); - association.rx_packets_bw = safe_div( association.rx_packets - ue_tp.rx_packets , time_lapse ); - association.tx_failed_pct = safe_pct( association.tx_failed - ue_tp.tx_failed, association.tx_packets); - association.tx_retries_pct = safe_pct( association.tx_retries - ue_tp.tx_retries, association.tx_packets); - association.tx_duration_pct = safe_pct( (association.tx_duration - ue_tp.tx_duration) / 1000000 , time_lapse ); + association.tx_bytes_delta = association.tx_bytes - ue_tp.tx_bytes; + association.rx_bytes_delta = association.rx_bytes - ue_tp.rx_bytes; + association.tx_packets_delta = association.tx_packets - ue_tp.tx_packets; + association.rx_packets_delta = association.rx_packets - ue_tp.rx_packets; + association.tx_failed_delta = association.tx_failed - ue_tp.tx_failed; + association.tx_retries_delta = association.tx_retries - ue_tp.tx_retries; + association.tx_duration_delta = association.tx_duration - ue_tp.tx_duration; } else { - association.tx_bytes_bw = safe_div( association.tx_bytes , time_lapse ); - association.rx_bytes_bw = safe_div( association.rx_bytes , time_lapse ); - association.tx_packets_bw = safe_div( association.tx_packets , time_lapse ); - association.rx_packets_bw = safe_div( association.rx_packets , time_lapse ); - association.tx_failed_pct = safe_pct( association.tx_failed, association.tx_packets); - association.tx_retries_pct = safe_pct( association.tx_retries, association.tx_packets); - association.tx_duration_pct = safe_pct( association.tx_duration / 1000000, time_lapse ); + association.tx_bytes_delta = association.tx_bytes; + association.rx_bytes_delta = association.rx_bytes; + association.tx_packets_delta = association.tx_packets; + association.rx_packets_delta = association.rx_packets; + association.tx_failed_delta = association.tx_failed; + association.tx_retries_delta = association.tx_retries; + association.tx_duration_delta = association.tx_duration; } + association.tx_bytes_bw = safe_div( association.tx_bytes_delta , time_lapse ); + association.rx_bytes_bw = safe_div( association.rx_bytes_delta , time_lapse ); + association.tx_packets_bw = safe_div( association.tx_packets_delta , time_lapse ); + association.rx_packets_bw = safe_div( association.rx_packets_delta , time_lapse ); + association.tx_failed_pct = safe_pct( association.tx_failed_delta, association.tx_packets); + association.tx_retries_pct = safe_pct( association.tx_retries_delta, association.tx_packets); + association.tx_duration_pct = safe_pct( (association.tx_duration_delta) / 1000000 , time_lapse ); + ssid.tx_failed_pct.max = std::max(ssid.tx_failed_pct.max, association.tx_failed_pct); ssid.tx_failed_pct.min = std::min(ssid.tx_failed_pct.min, association.tx_failed_pct); diff --git a/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp b/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp index 2197ad3..985bcfb 100644 --- a/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp +++ b/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp @@ -168,6 +168,7 @@ namespace OpenWifi::AnalyticsObjects { field_to_json(Obj,"tx_rate",tx_rate); field_to_json(Obj,"rx_rate",rx_rate); // field_to_json(Obj, "tidstats", tidstats); + field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw); field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw); field_to_json(Obj,"tx_packets_bw",tx_packets_bw); @@ -175,6 +176,14 @@ namespace OpenWifi::AnalyticsObjects { field_to_json(Obj,"tx_failed_pct",tx_failed_pct); field_to_json(Obj,"tx_retries_pct",tx_retries_pct); field_to_json(Obj,"tx_duration_pct",tx_duration_pct); + + field_to_json(Obj,"tx_bytes_delta",tx_bytes_delta); + field_to_json(Obj,"rx_bytes_delta",rx_bytes_delta); + field_to_json(Obj,"tx_packets_delta",tx_packets_delta); + field_to_json(Obj,"rx_packets_delta",rx_packets_delta); + field_to_json(Obj,"tx_failed_delta",tx_failed_delta); + field_to_json(Obj,"tx_retries_delta",tx_retries_delta); + field_to_json(Obj,"tx_duration_delta",tx_duration_delta); } bool UETimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) { @@ -193,6 +202,7 @@ namespace OpenWifi::AnalyticsObjects { field_from_json(Obj,"tx_rate",tx_rate); field_from_json(Obj,"rx_rate",rx_rate); // field_from_json(Obj,"tidstats",tidstats); + field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw); field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw); field_from_json(Obj,"tx_packets_bw",tx_packets_bw); @@ -200,6 +210,15 @@ namespace OpenWifi::AnalyticsObjects { field_from_json(Obj,"tx_failed_pct",tx_failed_pct); field_from_json(Obj,"tx_retries_pct",tx_retries_pct); field_from_json(Obj,"tx_duration_pct",tx_duration_pct); + + field_from_json(Obj,"tx_bytes_delta",tx_bytes_delta); + field_from_json(Obj,"rx_bytes_delta",rx_bytes_delta); + field_from_json(Obj,"tx_packets_delta",tx_packets_delta); + field_from_json(Obj,"rx_packets_delta",rx_packets_delta); + field_from_json(Obj,"tx_failed_delta",tx_failed_delta); + field_from_json(Obj,"tx_retries_delta",tx_retries_delta); + field_from_json(Obj,"tx_duration_delta",tx_duration_delta); + return true; } catch(...) { @@ -219,6 +238,7 @@ namespace OpenWifi::AnalyticsObjects { field_to_json(Obj,"tx_dropped",tx_dropped); field_to_json(Obj,"tx_errors",tx_errors); field_to_json(Obj,"tx_packets",tx_packets); + field_to_json(Obj,"tx_bytes_bw",tx_bytes_bw); field_to_json(Obj,"rx_bytes_bw",rx_bytes_bw); field_to_json(Obj,"rx_dropped_pct",rx_dropped_pct); @@ -227,6 +247,15 @@ namespace OpenWifi::AnalyticsObjects { field_to_json(Obj,"tx_packets_bw",tx_packets_bw); field_to_json(Obj,"rx_errors_pct",rx_errors_pct); field_to_json(Obj,"tx_errors_pct",tx_errors_pct); + + field_to_json(Obj,"tx_bytes_delta",tx_bytes_delta); + field_to_json(Obj,"rx_bytes_delta",rx_bytes_delta); + field_to_json(Obj,"rx_dropped_delta",rx_dropped_delta); + field_to_json(Obj,"tx_dropped_delta",tx_dropped_delta); + field_to_json(Obj,"rx_packets_delta",rx_packets_delta); + field_to_json(Obj,"tx_packets_delta",tx_packets_delta); + field_to_json(Obj,"rx_errors_delta",rx_errors_delta); + field_to_json(Obj,"tx_errors_delta",tx_errors_delta); } bool APTimePoint::from_json(const Poco::JSON::Object::Ptr &Obj) { @@ -242,6 +271,7 @@ namespace OpenWifi::AnalyticsObjects { field_from_json(Obj,"tx_dropped",tx_dropped); field_from_json(Obj,"tx_errors",tx_errors); field_from_json(Obj,"tx_packets",tx_packets); + field_from_json(Obj,"tx_bytes_bw",tx_bytes_bw); field_from_json(Obj,"rx_bytes_bw",rx_bytes_bw); field_from_json(Obj,"rx_dropped_pct",rx_dropped_pct); @@ -250,6 +280,16 @@ namespace OpenWifi::AnalyticsObjects { field_from_json(Obj,"tx_packets_bw",tx_packets_bw); field_from_json(Obj,"rx_errors_pct",rx_errors_pct); field_from_json(Obj,"tx_errors_pct",tx_errors_pct); + + field_from_json(Obj,"tx_bytes_delta",tx_bytes_delta); + field_from_json(Obj,"rx_bytes_delta",rx_bytes_delta); + field_from_json(Obj,"rx_dropped_delta",rx_dropped_delta); + field_from_json(Obj,"tx_dropped_delta",tx_dropped_delta); + field_from_json(Obj,"rx_packets_delta",rx_packets_delta); + field_from_json(Obj,"tx_packets_delta",tx_packets_delta); + field_from_json(Obj,"rx_errors_delta",rx_errors_delta); + field_from_json(Obj,"tx_errors_delta",tx_errors_delta); + return true; } catch(...) { diff --git a/src/RESTObjects/RESTAPI_AnalyticsObjects.h b/src/RESTObjects/RESTAPI_AnalyticsObjects.h index 1902b35..928bd7d 100644 --- a/src/RESTObjects/RESTAPI_AnalyticsObjects.h +++ b/src/RESTObjects/RESTAPI_AnalyticsObjects.h @@ -138,6 +138,14 @@ namespace OpenWifi { tx_retries_pct = 0.0 , tx_duration_pct = 0.0; + uint64_t tx_bytes_delta = 0, + rx_bytes_delta = 0, + tx_duration_delta = 0, + rx_packets_delta = 0, + tx_packets_delta = 0, + tx_retries_delta = 0, + tx_failed_delta = 0; + UE_rate tx_rate, rx_rate; std::vector tidstats; @@ -179,6 +187,7 @@ namespace OpenWifi { uint64_t band=0, channel=0; std::vector associations; + AveragePoint tx_bytes_bw, rx_bytes_bw, tx_packets_bw, @@ -213,6 +222,15 @@ namespace OpenWifi { rx_errors_pct = 0.0 , tx_errors_pct = 0.0; + uint64_t tx_bytes_delta = 0, + rx_bytes_delta = 0 , + rx_dropped_delta = 0, + tx_dropped_delta = 0, + rx_packets_delta = 0, + tx_packets_delta = 0, + rx_errors_delta = 0, + tx_errors_delta = 0; + void to_json(Poco::JSON::Object &Obj) const; bool from_json(const Poco::JSON::Object::Ptr &Obj); };