diff options
Diffstat (limited to 'statistics_controller.go')
-rw-r--r-- | statistics_controller.go | 27 |
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") |