Skip to content

Commit bee3d30

Browse files
authored
Add Previous Option for Kubernetes Logs Queries (#61)
1 parent b91991b commit bee3d30

File tree

7 files changed

+26
-10
lines changed

7 files changed

+26
-10
lines changed

pkg/kubernetes/client.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ type Client interface {
4343
GetNamespaces(ctx context.Context) (*data.Frame, error)
4444
GetResources(ctx context.Context, user string, groups []string, resourceId, namespace, parameterName, parameterValue string, wide bool) (*data.Frame, error)
4545
GetContainers(ctx context.Context, user string, groups []string, resourceId, namespace, name string) (*data.Frame, error)
46-
GetLogs(ctx context.Context, user string, groups []string, resourceId, namespace, name, container, filter string, tail int64, timeRange backend.TimeRange) (*data.Frame, error)
46+
GetLogs(ctx context.Context, user string, groups []string, resourceId, namespace, name, container, filter string, tail int64, previous bool, timeRange backend.TimeRange) (*data.Frame, error)
4747
GetResource(ctx context.Context, resourceId string) (*Resource, error)
4848
Proxy(user string, groups []string, requestUrl string, w http.ResponseWriter, r *http.Request)
4949
}
@@ -395,7 +395,7 @@ func (c *client) getPodsAndContainers(ctx context.Context, user string, groups [
395395
// The timeRange parameter is used to filter the log lines based on their
396396
// timestamp. Only log lines that are within the time range are included in the
397397
// data frame.
398-
func (c *client) GetLogs(ctx context.Context, user string, groups []string, resourceId, namespace, name, container, filter string, tail int64, timeRange backend.TimeRange) (*data.Frame, error) {
398+
func (c *client) GetLogs(ctx context.Context, user string, groups []string, resourceId, namespace, name, container, filter string, tail int64, previous bool, timeRange backend.TimeRange) (*data.Frame, error) {
399399
ctx, span := tracing.DefaultTracer().Start(ctx, "GetLogs")
400400
defer span.End()
401401
span.SetAttributes(attribute.Key("user").String(user))
@@ -405,6 +405,8 @@ func (c *client) GetLogs(ctx context.Context, user string, groups []string, reso
405405
span.SetAttributes(attribute.Key("name").String(name))
406406
span.SetAttributes(attribute.Key("container").String(container))
407407
span.SetAttributes(attribute.Key("filter").String(filter))
408+
span.SetAttributes(attribute.Key("tail").Int64(tail))
409+
span.SetAttributes(attribute.Key("previous").Bool(previous))
408410

409411
// Get the pods for the requested resource.
410412
pods, _, err := c.getPodsAndContainers(ctx, user, groups, resourceId, namespace, name)
@@ -427,6 +429,7 @@ func (c *client) GetLogs(ctx context.Context, user string, groups []string, reso
427429

428430
options := &corev1.PodLogOptions{
429431
Container: container,
432+
Previous: previous,
430433
Timestamps: true,
431434
SinceTime: &metav1.Time{Time: timeRange.From},
432435
}

pkg/kubernetes/client_mock.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/kubernetes/client_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ func TestGetLogs(t *testing.T) {
169169
require.NoError(t, err)
170170

171171
t.Run("should return logs", func(t *testing.T) {
172-
actualLogs, err := client.GetLogs(context.Background(), "", nil, "pod", "default", "echoserver", "echoserver", "", 0, backend.TimeRange{From: time.Now().Add(-1 * time.Hour), To: time.Now().Add(1 * time.Hour)})
172+
actualLogs, err := client.GetLogs(context.Background(), "", nil, "pod", "default", "echoserver", "echoserver", "", 0, false, backend.TimeRange{From: time.Now().Add(-1 * time.Hour), To: time.Now().Add(1 * time.Hour)})
173173
require.NoError(t, err)
174174
require.Equal(t, "timestamp", actualLogs.Fields[0].Name)
175175
require.Equal(t, "body", actualLogs.Fields[1].Name)
@@ -187,7 +187,7 @@ func TestGetLogs(t *testing.T) {
187187
})
188188

189189
t.Run("should return filtered logs", func(t *testing.T) {
190-
actualLogs, err := client.GetLogs(context.Background(), "", nil, "pod", "default", "echoserver", "echoserver", "build", 0, backend.TimeRange{From: time.Now().Add(-1 * time.Hour), To: time.Now().Add(1 * time.Hour)})
190+
actualLogs, err := client.GetLogs(context.Background(), "", nil, "pod", "default", "echoserver", "echoserver", "build", 0, false, backend.TimeRange{From: time.Now().Add(-1 * time.Hour), To: time.Now().Add(1 * time.Hour)})
191191
require.NoError(t, err)
192192
require.Equal(t, "timestamp", actualLogs.Fields[0].Name)
193193
require.Equal(t, "body", actualLogs.Fields[1].Name)

pkg/models/query.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ type QueryModelKubernetesLogs struct {
3434
Container string `json:"container"`
3535
Filter string `json:"filter"`
3636
Tail int64 `json:"tail"`
37+
Previous bool `json:"previous"`
3738
}
3839

3940
type QueryModelHelmReleases struct {

pkg/plugin/kubernetes.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ func (d *Datasource) handleKubernetesLogs(ctx context.Context, query concurrent.
233233
return backend.ErrorResponseWithErrorSource(err)
234234
}
235235

236-
d.logger.Info("handleKubernetesLogs query", "user", user, "groups", groups, "resourceId", qm.ResourceId, "namespace", qm.Namespace, "name", qm.Name, "container", qm.Container, "filter", qm.Filter, "tail", qm.Tail)
236+
d.logger.Info("handleKubernetesLogs query", "user", user, "groups", groups, "resourceId", qm.ResourceId, "namespace", qm.Namespace, "name", qm.Name, "container", qm.Container, "filter", qm.Filter, "tail", qm.Tail, "previous", qm.Previous)
237237
span.SetAttributes(attribute.Key("user").String(user))
238238
span.SetAttributes(attribute.Key("groups").StringSlice(groups))
239239
span.SetAttributes(attribute.Key("resourceId").String(qm.ResourceId))
@@ -242,8 +242,9 @@ func (d *Datasource) handleKubernetesLogs(ctx context.Context, query concurrent.
242242
span.SetAttributes(attribute.Key("container").String(qm.Container))
243243
span.SetAttributes(attribute.Key("filter").String(qm.Filter))
244244
span.SetAttributes(attribute.Key("tail").Int64(qm.Tail))
245+
span.SetAttributes(attribute.Key("previous").Bool(qm.Previous))
245246

246-
frame, err := d.kubeClient.GetLogs(ctx, user, groups, qm.ResourceId, qm.Namespace, qm.Name, qm.Container, qm.Filter, qm.Tail, query.DataQuery.TimeRange)
247+
frame, err := d.kubeClient.GetLogs(ctx, user, groups, qm.ResourceId, qm.Namespace, qm.Name, qm.Container, qm.Filter, qm.Tail, qm.Previous, query.DataQuery.TimeRange)
247248
if err != nil {
248249
d.logger.Error("Failed to get logs", "error", err.Error())
249250
span.RecordError(err)

src/datasource/components/queryeditor/KubernetesLogs.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
ComboboxOption,
55
InlineField,
66
InlineFieldRow,
7+
InlineSwitch,
78
Input,
89
} from '@grafana/ui';
910
import { QueryEditorProps } from '@grafana/data';
@@ -87,6 +88,14 @@ export function KubernetesLogs({
8788
value={query.tail || 0}
8889
/>
8990
</InlineField>
91+
<InlineField label="Previous">
92+
<InlineSwitch
93+
value={query.previous || false}
94+
onChange={(event: ChangeEvent<HTMLInputElement>) => {
95+
onChange({ ...query, previous: event.target.checked });
96+
}}
97+
/>
98+
</InlineField>
9099
<InlineField label="Filter" grow={true}>
91100
<Input
92101
id="query-editor-filter"

src/datasource/types/query.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export const DEFAULT_QUERIES: Record<QueryType, Partial<Query>> = {
4545
container: '',
4646
filter: '',
4747
tail: 0,
48+
previous: false,
4849
},
4950
'helm-releases': {
5051
namespace: 'default',
@@ -118,6 +119,7 @@ export interface QueryModelKubernetesLogs {
118119
container?: string;
119120
filter?: string;
120121
tail?: number;
122+
previous?: boolean;
121123
}
122124

123125
export interface QueryModelHelmReleases {

0 commit comments

Comments
 (0)