github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/logcli/seriesquery/series.go (about) 1 package seriesquery 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "sort" 8 "text/tabwriter" 9 "time" 10 11 "github.com/grafana/loki/pkg/logcli/client" 12 "github.com/grafana/loki/pkg/loghttp" 13 ) 14 15 // SeriesQuery contains all necessary fields to execute label queries and print out the results 16 type SeriesQuery struct { 17 Matcher string 18 Start time.Time 19 End time.Time 20 AnalyzeLabels bool 21 Quiet bool 22 } 23 24 type labelDetails struct { 25 name string 26 inStreams int 27 uniqueVals map[string]struct{} 28 } 29 30 // DoSeries prints out series results 31 func (q *SeriesQuery) DoSeries(c client.Client) { 32 streams := q.GetSeries(c) 33 34 if q.AnalyzeLabels { 35 labelMap := map[string]*labelDetails{} 36 37 for _, stream := range streams { 38 for labelName, labelValue := range stream { 39 if _, ok := labelMap[labelName]; ok { 40 labelMap[labelName].inStreams++ 41 labelMap[labelName].uniqueVals[labelValue] = struct{}{} 42 } else { 43 labelMap[labelName] = &labelDetails{ 44 name: labelName, 45 inStreams: 1, 46 uniqueVals: map[string]struct{}{labelValue: {}}, 47 } 48 } 49 } 50 } 51 52 lds := make([]*labelDetails, 0, len(labelMap)) 53 for _, ld := range labelMap { 54 lds = append(lds, ld) 55 } 56 sort.Slice(lds, func(ld1, ld2 int) bool { 57 return len(lds[ld1].uniqueVals) > len(lds[ld2].uniqueVals) 58 }) 59 60 fmt.Println("Total Streams: ", len(streams)) 61 fmt.Println("Unique Labels: ", len(labelMap)) 62 fmt.Println() 63 64 w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) 65 fmt.Fprintf(w, "Label Name\tUnique Values\tFound In Streams\n") 66 for _, details := range lds { 67 fmt.Fprintf(w, "%v\t%v\t%v\n", details.name, len(details.uniqueVals), details.inStreams) 68 } 69 w.Flush() 70 71 } else { 72 for _, value := range streams { 73 fmt.Println(value) 74 } 75 } 76 77 } 78 79 // GetSeries returns an array of label sets 80 func (q *SeriesQuery) GetSeries(c client.Client) []loghttp.LabelSet { 81 seriesResponse, err := c.Series([]string{q.Matcher}, q.Start, q.End, q.Quiet) 82 if err != nil { 83 log.Fatalf("Error doing request: %+v", err) 84 } 85 return seriesResponse.Data 86 }