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  }