mirror of https://github.com/grafana/loki
Promtail: adding pipeline stage inspector (#4011)
* Adding promtail pipeline stage inspector Signed-off-by: Danny Kopping <danny.kopping@grafana.com> * Adding library Signed-off-by: Danny Kopping <danny.kopping@grafana.com> * Adding docs Signed-off-by: Danny Kopping <danny.kopping@grafana.com> * Appeasing the linter Signed-off-by: Danny Kopping <danny.kopping@grafana.com> * Further appeasing the linter Signed-off-by: Danny Kopping <danny.kopping@grafana.com> * Removing old version of go-cmp to pass check-mod step Signed-off-by: Danny Kopping <danny.kopping@grafana.com> * Making screenshot narrower and correcting link Signed-off-by: Danny Kopping <danny.kopping@grafana.com> * Apply suggestions from code review Co-authored-by: Karen Miller <84039272+KMiller-Grafana@users.noreply.github.com> * Copy changes Signed-off-by: Danny Kopping <danny.kopping@grafana.com> * Copy changes Signed-off-by: Danny Kopping <danny.kopping@grafana.com> Co-authored-by: Karen Miller <84039272+KMiller-Grafana@users.noreply.github.com>pull/4025/head
parent
2fd633cded
commit
ac63ea8500
@ -0,0 +1,129 @@ |
||||
package stages |
||||
|
||||
import ( |
||||
"fmt" |
||||
"io" |
||||
"strings" |
||||
|
||||
"github.com/fatih/color" |
||||
"github.com/google/go-cmp/cmp" |
||||
) |
||||
|
||||
type inspector struct { |
||||
writer io.Writer |
||||
formatter *formatter |
||||
} |
||||
|
||||
func newInspector(writer io.Writer, disableFormatting bool) *inspector { |
||||
f := &formatter{ |
||||
red: color.New(color.FgRed), |
||||
yellow: color.New(color.FgYellow), |
||||
green: color.New(color.FgGreen), |
||||
bold: color.New(color.Bold), |
||||
} |
||||
|
||||
if disableFormatting { |
||||
f.disable() |
||||
} |
||||
|
||||
return &inspector{ |
||||
writer: writer, |
||||
formatter: f, |
||||
} |
||||
} |
||||
|
||||
type formatter struct { |
||||
red *color.Color |
||||
yellow *color.Color |
||||
green *color.Color |
||||
bold *color.Color |
||||
} |
||||
|
||||
func (f *formatter) disable() { |
||||
f.red.DisableColor() |
||||
f.yellow.DisableColor() |
||||
f.green.DisableColor() |
||||
f.bold.DisableColor() |
||||
} |
||||
|
||||
func (i inspector) inspect(stageName string, before *Entry, after Entry) { |
||||
if before == nil { |
||||
fmt.Fprintln(i.writer, i.formatter.red.Sprintf("could not copy entry in '%s' stage; inspect aborted", stageName)) |
||||
return |
||||
} |
||||
|
||||
r := diffReporter{ |
||||
formatter: i.formatter, |
||||
} |
||||
|
||||
cmp.Equal(*before, after, cmp.Reporter(&r)) |
||||
|
||||
diff := r.String() |
||||
if strings.TrimSpace(diff) == "" { |
||||
diff = i.formatter.red.Sprintf("none") |
||||
} |
||||
|
||||
fmt.Fprintf(i.writer, "[inspect: %s stage]: %s\n", i.formatter.bold.Sprintf("%s", stageName), diff) |
||||
} |
||||
|
||||
// diffReporter is a simple custom reporter that only records differences
|
||||
// detected during comparison.
|
||||
type diffReporter struct { |
||||
path cmp.Path |
||||
|
||||
formatter *formatter |
||||
|
||||
diffs []string |
||||
} |
||||
|
||||
func (r *diffReporter) PushStep(ps cmp.PathStep) { |
||||
r.path = append(r.path, ps) |
||||
} |
||||
|
||||
func (r *diffReporter) Report(rs cmp.Result) { |
||||
if rs.Equal() { |
||||
return |
||||
} |
||||
|
||||
vx, vy := r.path.Last().Values() |
||||
|
||||
// TODO(dannyk): try using go-cmp to filter this condition out with Equal(), but for now this just makes it work
|
||||
if fmt.Sprintf("%v", vx) == fmt.Sprintf("%v", vy) { |
||||
return |
||||
} |
||||
|
||||
change := vx.IsValid() |
||||
addition := vy.IsValid() |
||||
removal := change && !addition |
||||
mod := addition && change |
||||
|
||||
var titleColor *color.Color |
||||
switch { |
||||
case mod: |
||||
titleColor = r.formatter.yellow |
||||
case removal: |
||||
titleColor = r.formatter.red |
||||
default: |
||||
titleColor = r.formatter.green |
||||
} |
||||
|
||||
r.diffs = append(r.diffs, titleColor.Sprintf("%#v:", r.path)) |
||||
|
||||
if removal { |
||||
r.diffs = append(r.diffs, r.formatter.red.Sprintf("\t-: %v", vx)) |
||||
} |
||||
if mod { |
||||
r.diffs = append(r.diffs, r.formatter.yellow.Sprintf("\t-: %v", vx)) |
||||
} |
||||
if addition { |
||||
r.diffs = append(r.diffs, r.formatter.green.Sprintf("\t+: %v", vy)) |
||||
} |
||||
} |
||||
|
||||
func (r *diffReporter) PopStep() { |
||||
r.path = r.path[:len(r.path)-1] |
||||
} |
||||
|
||||
func (r *diffReporter) String() string { |
||||
return fmt.Sprintf("\n%s", strings.Join(r.diffs, "\n")) |
||||
} |
After Width: | Height: | Size: 119 KiB |
Loading…
Reference in new issue