QueryPatterns returns drain3 patterns grouped by the specified dimension.
(_ context.Context, filters InsightsFilters)
| 598 | |
| 599 | // QueryPatterns returns drain3 patterns grouped by the specified dimension. |
| 600 | func (e *Engine) QueryPatterns(_ context.Context, filters InsightsFilters) ([]PatternGroup, error) { |
| 601 | e.mu.RLock() |
| 602 | defer e.mu.RUnlock() |
| 603 | |
| 604 | groupBy := filters.GroupBy |
| 605 | if groupBy == "" { |
| 606 | groupBy = "service" |
| 607 | } |
| 608 | |
| 609 | limit := 20 |
| 610 | if filters.Limit != nil && *filters.Limit > 0 { |
| 611 | limit = *filters.Limit |
| 612 | } |
| 613 | |
| 614 | // For severity grouping, use the pre-built drain3 instances |
| 615 | if groupBy == "severity" { |
| 616 | result := make([]PatternGroup, 0) |
| 617 | for severity, dm := range e.drain3BySeverity { |
| 618 | if dm == nil { |
| 619 | continue |
| 620 | } |
| 621 | patterns := dm.GetTopPatterns(limit) |
| 622 | if len(patterns) == 0 { |
| 623 | continue |
| 624 | } |
| 625 | items := make([]PatternItem, len(patterns)) |
| 626 | for i, p := range patterns { |
| 627 | items[i] = PatternItem{ |
| 628 | Pattern: p.Template, |
| 629 | Count: p.Count, |
| 630 | Percentage: p.Percentage, |
| 631 | } |
| 632 | } |
| 633 | result = append(result, PatternGroup{ |
| 634 | GroupValue: severity, |
| 635 | Patterns: items, |
| 636 | }) |
| 637 | } |
| 638 | return result, nil |
| 639 | } |
| 640 | |
| 641 | // For other groupings, use the combined drain3 and return as single group |
| 642 | patterns := e.drain3All.GetTopPatterns(limit) |
| 643 | items := make([]PatternItem, len(patterns)) |
| 644 | for i, p := range patterns { |
| 645 | items[i] = PatternItem{ |
| 646 | Pattern: p.Template, |
| 647 | Count: p.Count, |
| 648 | Percentage: p.Percentage, |
| 649 | } |
| 650 | } |
| 651 | |
| 652 | return []PatternGroup{{ |
| 653 | GroupValue: "all", |
| 654 | Patterns: items, |
| 655 | }}, nil |
| 656 | } |
| 657 |
no test coverage detected