aboutsummaryrefslogtreecommitdiff
path: root/statistics_controller.go
diff options
context:
space:
mode:
Diffstat (limited to 'statistics_controller.go')
-rw-r--r--statistics_controller.go27
1 files changed, 21 insertions, 6 deletions
diff --git a/statistics_controller.go b/statistics_controller.go
index 1714c0b..57c7d95 100644
--- a/statistics_controller.go
+++ b/statistics_controller.go
@@ -29,26 +29,29 @@ type StatisticRecord struct {
ConnectionsPerService map[uint16]int `json:"connections_per_service,omitempty" bson:"connections_per_service"`
ClientBytesPerService map[uint16]int `json:"client_bytes_per_service,omitempty" bson:"client_bytes_per_service"`
ServerBytesPerService map[uint16]int `json:"server_bytes_per_service,omitempty" bson:"server_bytes_per_service"`
+ TotalBytesPerService map[uint16]int `json:"total_bytes_per_service,omitempty" bson:"total_bytes_per_service"`
DurationPerService map[uint16]int64 `json:"duration_per_service,omitempty" bson:"duration_per_service"`
+ MatchedRules map[RowID]int64 `json:"matched_rules,omitempty" bson:"matched_rules"`
}
type StatisticsFilter struct {
RangeFrom time.Time `form:"range_from"`
RangeTo time.Time `form:"range_to"`
Ports []uint16 `form:"ports"`
+ RulesIDs []RowID `form:"rules_ids"`
Metric string `form:"metric"`
}
type StatisticsController struct {
- storage Storage
- metrics []string
+ storage Storage
+ servicesMetrics []string
}
func NewStatisticsController(storage Storage) StatisticsController {
return StatisticsController{
storage: storage,
- metrics: []string{"connections_per_service", "client_bytes_per_service",
- "server_bytes_per_service", "duration_per_service"},
+ servicesMetrics: []string{"connections_per_service", "client_bytes_per_service",
+ "server_bytes_per_service", "total_bytes_per_service", "duration_per_service"},
}
}
@@ -62,19 +65,31 @@ func (sc *StatisticsController) GetStatistics(context context.Context, filter St
query = query.Filter(OrderedDocument{{"_id", UnorderedDocument{"$gt": filter.RangeTo}}})
}
for _, port := range filter.Ports {
- for _, metric := range sc.metrics {
+ for _, metric := range sc.servicesMetrics {
if filter.Metric == "" || filter.Metric == metric {
query = query.Projection(OrderedDocument{{fmt.Sprintf("%s.%d", metric, port), 1}})
}
}
+
}
if filter.Metric != "" && len(filter.Ports) == 0 {
- for _, metric := range sc.metrics {
+ for _, metric := range sc.servicesMetrics {
if filter.Metric == metric {
query = query.Projection(OrderedDocument{{metric, 1}})
}
}
}
+ for _, ruleID := range filter.RulesIDs {
+ if filter.Metric == "" || filter.Metric == "matched_rules" {
+ query = query.Projection(OrderedDocument{{fmt.Sprintf("matched_rules.%s", ruleID.Hex()), 1}})
+ }
+
+ }
+ if filter.Metric != "" && len(filter.RulesIDs) == 0 {
+ if filter.Metric == "matched_rules" {
+ query = query.Projection(OrderedDocument{{"matched_rules", 1}})
+ }
+ }
if err := query.All(&statisticRecords); err != nil {
log.WithError(err).WithField("filter", filter).Error("failed to retrieve statistics")