diff --git a/CHANGELOG.md b/CHANGELOG.md index 1079db9cadd4..1997ed853e2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,7 @@ * [4860](https://github.com/grafana/loki/pull/4860) **cyriltovena**: Add rate limiting and metrics to hedging * [4865](https://github.com/grafana/loki/pull/4865) **taisho6339**: Fix duplicate registry.MustRegister call in Promtail Kafka * [4845](https://github.com/grafana/loki/pull/4845) **chaudum** Return error responses consistently as JSON +* [6163](https://github.com/grafana/loki/pull/6163) **jburnham**: LogQL: add `default` sprig template function in logql label/line formatter ## Unreleased ### All Changes diff --git a/docs/sources/logql/template_functions.md b/docs/sources/logql/template_functions.md index aad284691f81..9ed5784b52ff 100644 --- a/docs/sources/logql/template_functions.md +++ b/docs/sources/logql/template_functions.md @@ -666,3 +666,21 @@ Example of a query to filter Loki querier jobs which create time is 1 day before ```logql {job="loki/querier"} | label_format nowEpoch=`{{(unixEpoch now)}}`,createDateEpoch=`{{unixEpoch (toDate "2006-01-02" .createDate)}}` | label_format dateTimeDiff="{{sub .nowEpoch .createDateEpoch}}" | dateTimeDiff > 86400 ``` + +## default + +`default` checks whether the string(`src`) is set, and returns default(`d`) if not set. + +Signature: `default(d string, src string) string` + +Examples: + +```template +{{ default "-" "" }} // output: - +{{ default "-" "foo" }} // output: foo +``` + +Example of a query to print a `-` if the `http_request_headers_x_forwarded_for` label is empty: +```logql +{job="access_log"} | json | line_format `{{.http_request_headers_x_forwarded_for | default "-"}}` +``` diff --git a/pkg/logql/log/fmt.go b/pkg/logql/log/fmt.go index 600d12d7ab55..1fc52f974e8c 100644 --- a/pkg/logql/log/fmt.go +++ b/pkg/logql/log/fmt.go @@ -84,6 +84,7 @@ var ( "toDate", "now", "unixEpoch", + "default", } ) diff --git a/pkg/logql/log/fmt_test.go b/pkg/logql/log/fmt_test.go index 71d111a43d8f..30dc02e3dbc2 100644 --- a/pkg/logql/log/fmt_test.go +++ b/pkg/logql/log/fmt_test.go @@ -265,6 +265,14 @@ func Test_lineFormatter_Format(t *testing.T) { labels.Labels{{Name: "bar", Value: "2"}}, []byte("1"), }, + { + "default", + newMustLineFormatter(`{{.foo | default "-" }}{{.bar | default "-"}}{{.unknown | default "-"}}`), + labels.Labels{{Name: "foo", Value: "blip"}, {Name: "bar", Value: ""}}, + []byte("blip--"), + labels.Labels{{Name: "foo", Value: "blip"}, {Name: "bar", Value: ""}}, + nil, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -325,6 +333,14 @@ func Test_labelsFormatter_Format(t *testing.T) { labels.Labels{{Name: "status", Value: "200"}}, labels.Labels{{Name: "status", Value: "2"}}, }, + { + "default", + mustNewLabelsFormatter([]LabelFmt{ + NewTemplateLabelFmt("blip", `{{.foo | default "-" }} and {{.bar}}`), + }), + labels.Labels{{Name: "bar", Value: "blop"}}, + labels.Labels{{Name: "blip", Value: "- and blop"}, {Name: "bar", Value: "blop"}}, + }, } for _, tt := range tests {