From e95f44d3f8558dfb6522947c4c8d99a34465c19d Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Tue, 17 Dec 2019 11:32:38 +0000 Subject: [PATCH 1/8] Move runtime/kubernetes/client to util/kubernetes/client --- runtime/kubernetes/kubernetes.go | 2 +- runtime/kubernetes/service.go | 2 +- {runtime => util}/kubernetes/client/api/api_test.go | 0 {runtime => util}/kubernetes/client/api/request.go | 0 {runtime => util}/kubernetes/client/api/response.go | 0 {runtime => util}/kubernetes/client/client.go | 2 +- {runtime => util}/kubernetes/client/kubernetes.go | 0 {runtime => util}/kubernetes/client/templates.go | 0 {runtime => util}/kubernetes/client/types.go | 0 {runtime => util}/kubernetes/client/util.go | 0 {runtime => util}/kubernetes/client/util_test.go | 0 11 files changed, 3 insertions(+), 3 deletions(-) rename {runtime => util}/kubernetes/client/api/api_test.go (100%) rename {runtime => util}/kubernetes/client/api/request.go (100%) rename {runtime => util}/kubernetes/client/api/response.go (100%) rename {runtime => util}/kubernetes/client/client.go (98%) rename {runtime => util}/kubernetes/client/kubernetes.go (100%) rename {runtime => util}/kubernetes/client/templates.go (100%) rename {runtime => util}/kubernetes/client/types.go (100%) rename {runtime => util}/kubernetes/client/util.go (100%) rename {runtime => util}/kubernetes/client/util_test.go (100%) diff --git a/runtime/kubernetes/kubernetes.go b/runtime/kubernetes/kubernetes.go index d451254a..9c5d9089 100644 --- a/runtime/kubernetes/kubernetes.go +++ b/runtime/kubernetes/kubernetes.go @@ -7,7 +7,7 @@ import ( "time" "github.com/micro/go-micro/runtime" - "github.com/micro/go-micro/runtime/kubernetes/client" + "github.com/micro/go-micro/util/kubernetes/client" "github.com/micro/go-micro/util/log" ) diff --git a/runtime/kubernetes/service.go b/runtime/kubernetes/service.go index ec837682..704aafcf 100644 --- a/runtime/kubernetes/service.go +++ b/runtime/kubernetes/service.go @@ -5,7 +5,7 @@ import ( "time" "github.com/micro/go-micro/runtime" - "github.com/micro/go-micro/runtime/kubernetes/client" + "github.com/micro/go-micro/util/kubernetes/client" "github.com/micro/go-micro/util/log" ) diff --git a/runtime/kubernetes/client/api/api_test.go b/util/kubernetes/client/api/api_test.go similarity index 100% rename from runtime/kubernetes/client/api/api_test.go rename to util/kubernetes/client/api/api_test.go diff --git a/runtime/kubernetes/client/api/request.go b/util/kubernetes/client/api/request.go similarity index 100% rename from runtime/kubernetes/client/api/request.go rename to util/kubernetes/client/api/request.go diff --git a/runtime/kubernetes/client/api/response.go b/util/kubernetes/client/api/response.go similarity index 100% rename from runtime/kubernetes/client/api/response.go rename to util/kubernetes/client/api/response.go diff --git a/runtime/kubernetes/client/client.go b/util/kubernetes/client/client.go similarity index 98% rename from runtime/kubernetes/client/client.go rename to util/kubernetes/client/client.go index 4637a9d8..3680863f 100644 --- a/runtime/kubernetes/client/client.go +++ b/util/kubernetes/client/client.go @@ -9,7 +9,7 @@ import ( "os" "path" - "github.com/micro/go-micro/runtime/kubernetes/client/api" + "github.com/micro/go-micro/util/kubernetes/client/api" "github.com/micro/go-micro/util/log" ) diff --git a/runtime/kubernetes/client/kubernetes.go b/util/kubernetes/client/kubernetes.go similarity index 100% rename from runtime/kubernetes/client/kubernetes.go rename to util/kubernetes/client/kubernetes.go diff --git a/runtime/kubernetes/client/templates.go b/util/kubernetes/client/templates.go similarity index 100% rename from runtime/kubernetes/client/templates.go rename to util/kubernetes/client/templates.go diff --git a/runtime/kubernetes/client/types.go b/util/kubernetes/client/types.go similarity index 100% rename from runtime/kubernetes/client/types.go rename to util/kubernetes/client/types.go diff --git a/runtime/kubernetes/client/util.go b/util/kubernetes/client/util.go similarity index 100% rename from runtime/kubernetes/client/util.go rename to util/kubernetes/client/util.go diff --git a/runtime/kubernetes/client/util_test.go b/util/kubernetes/client/util_test.go similarity index 100% rename from runtime/kubernetes/client/util_test.go rename to util/kubernetes/client/util_test.go From 0415ead50470706bd77741a8800ad5d1847057de Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Tue, 17 Dec 2019 12:11:26 +0000 Subject: [PATCH 2/8] First commit for Kubernetes logger --- debug/log/kubernetes/kubernetes.go | 23 +++++++++++++ debug/log/kubernetes/kubernetes_test.go | 44 +++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 debug/log/kubernetes/kubernetes.go create mode 100644 debug/log/kubernetes/kubernetes_test.go diff --git a/debug/log/kubernetes/kubernetes.go b/debug/log/kubernetes/kubernetes.go new file mode 100644 index 00000000..65841ef8 --- /dev/null +++ b/debug/log/kubernetes/kubernetes.go @@ -0,0 +1,23 @@ +// Package kubernetes is a logger implementing (github.com/micro/go-micro/debug/log).Log +package kubernetes + +import ( + "github.com/micro/go-micro/debug/log" +) + +type klog struct{} + +func (k *klog) Read(...log.ReadOption) []log.Record { return nil } + +func (k *klog) Write(log.Record) {} + +func (k *klog) Stream(stop chan bool) <-chan log.Record { + c := make(chan log.Record) + go close(c) + return c +} + +// New returns a configured Kubernetes logger +func New() log.Log { + return &klog{} +} diff --git a/debug/log/kubernetes/kubernetes_test.go b/debug/log/kubernetes/kubernetes_test.go new file mode 100644 index 00000000..af9ce9b3 --- /dev/null +++ b/debug/log/kubernetes/kubernetes_test.go @@ -0,0 +1,44 @@ +package kubernetes + +import ( + "bytes" + "io" + "os" + "testing" + "time" + + "github.com/micro/go-micro/debug/log" + "github.com/stretchr/testify/assert" +) + +func TestKubernetes(t *testing.T) { + k := New() + r, w, err := os.Pipe() + if err != nil { + t.Fatal(err) + } + s := os.Stderr + os.Stderr = w + meta := make(map[string]string) + meta["foo"] = "bar" + k.Write(log.Record{ + Timestamp: time.Unix(0, 0), + Value: "Test log entry", + Metadata: meta, + }) + b := &bytes.Buffer{} + w.Close() + io.Copy(b, r) + os.Stderr = s + assert.Equal(t, "Test log entry", b.String(), "Write was not equal") + + assert.Nil(t, k.Read(), "Read should be unimplemented") + + stream := k.Stream(make(chan bool)) + records := []log.Record{} + for s := range stream { + records = append(records, s) + } + assert.Equal(t, 0, len(records), "Stream should be unimplemented") + +} From 53ca742c66bf696f6edc01c8e962ac0ef59a03b1 Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Tue, 17 Dec 2019 16:09:51 +0000 Subject: [PATCH 3/8] Update the util/kubernetes client to retrieve logs --- debug/log/kubernetes/kubernetes.go | 4 +++- debug/log/kubernetes/kubernetes_test.go | 15 +++++++++++---- debug/log/kubernetes/log.go | 15 +++++++++++++++ debug/log/log.go | 8 ++++---- util/kubernetes/client/api/api_test.go | 11 +++++++++++ util/kubernetes/client/api/request.go | 25 +++++++++++++++++++++++++ util/kubernetes/client/client.go | 16 ++++++++++++++++ 7 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 debug/log/kubernetes/log.go diff --git a/debug/log/kubernetes/kubernetes.go b/debug/log/kubernetes/kubernetes.go index 65841ef8..529b5d7c 100644 --- a/debug/log/kubernetes/kubernetes.go +++ b/debug/log/kubernetes/kubernetes.go @@ -9,7 +9,9 @@ type klog struct{} func (k *klog) Read(...log.ReadOption) []log.Record { return nil } -func (k *klog) Write(log.Record) {} +func (k *klog) Write(l log.Record) { + write(l) +} func (k *klog) Stream(stop chan bool) <-chan log.Record { c := make(chan log.Record) diff --git a/debug/log/kubernetes/kubernetes_test.go b/debug/log/kubernetes/kubernetes_test.go index af9ce9b3..c1eca93d 100644 --- a/debug/log/kubernetes/kubernetes_test.go +++ b/debug/log/kubernetes/kubernetes_test.go @@ -2,6 +2,7 @@ package kubernetes import ( "bytes" + "encoding/json" "io" "os" "testing" @@ -13,6 +14,7 @@ import ( func TestKubernetes(t *testing.T) { k := New() + r, w, err := os.Pipe() if err != nil { t.Fatal(err) @@ -20,17 +22,22 @@ func TestKubernetes(t *testing.T) { s := os.Stderr os.Stderr = w meta := make(map[string]string) - meta["foo"] = "bar" - k.Write(log.Record{ + write := log.Record{ Timestamp: time.Unix(0, 0), Value: "Test log entry", Metadata: meta, - }) + } + meta["foo"] = "bar" + k.Write(write) b := &bytes.Buffer{} w.Close() io.Copy(b, r) os.Stderr = s - assert.Equal(t, "Test log entry", b.String(), "Write was not equal") + var read log.Record + if err := json.Unmarshal(b.Bytes(), &read); err != nil { + t.Fatalf("json.Unmarshal failed: %s", err.Error()) + } + assert.Equal(t, write, read, "Write was not equal") assert.Nil(t, k.Read(), "Read should be unimplemented") diff --git a/debug/log/kubernetes/log.go b/debug/log/kubernetes/log.go new file mode 100644 index 00000000..ea352165 --- /dev/null +++ b/debug/log/kubernetes/log.go @@ -0,0 +1,15 @@ +package kubernetes + +import "github.com/micro/go-micro/debug/log" + +import ( + "encoding/json" + "fmt" + "os" +) + +func write(l log.Record) { + if m, err := json.Marshal(l); err == nil { + fmt.Fprintf(os.Stderr, "%s", m) + } +} diff --git a/debug/log/log.go b/debug/log/log.go index 42a8f558..f4ad0d76 100644 --- a/debug/log/log.go +++ b/debug/log/log.go @@ -29,14 +29,14 @@ type Log interface { // Record is log record entry type Record struct { // Timestamp of logged event - Timestamp time.Time + Timestamp time.Time `json:"time"` // Value contains log entry - Value interface{} + Value interface{} `json:"value"` // Metadata to enrich log record - Metadata map[string]string + Metadata map[string]string `json:"metadata"` } -// level is a log level +// Level is a log level type Level int const ( diff --git a/util/kubernetes/client/api/api_test.go b/util/kubernetes/client/api/api_test.go index 474dff55..f1f45fdd 100644 --- a/util/kubernetes/client/api/api_test.go +++ b/util/kubernetes/client/api/api_test.go @@ -111,6 +111,17 @@ var tests = []testcase{ URI: "/apis/apps/v1/namespaces/default/deployments/baz", Header: map[string]string{"foo": "bar"}, }, + testcase{ + ReqFn: func(opts *Options) *Request { + return NewRequest(opts). + Get(). + Resource("pod"). + SubResource("log"). + Name("foolog") + }, + Method: "GET", + URI: "/api/v1/namespaces/default/pods/foolog/log", + }, } var wrappedHandler = func(test *testcase, t *testing.T) http.HandlerFunc { diff --git a/util/kubernetes/client/api/request.go b/util/kubernetes/client/api/request.go index 1b454c00..53d57195 100644 --- a/util/kubernetes/client/api/request.go +++ b/util/kubernetes/client/api/request.go @@ -23,6 +23,7 @@ type Request struct { resource string resourceName *string + subResource *string body io.Reader err error @@ -79,6 +80,13 @@ func (r *Request) Resource(s string) *Request { return r } +// SubResource sets a subresource on a resource, +// e.g. pods/log for pod logs +func (r *Request) SubResource(s string) *Request { + r.subResource = &s + return r +} + // Name is for targeting a specific resource by id func (r *Request) Name(s string) *Request { r.resourceName = &s @@ -154,6 +162,9 @@ func (r *Request) request() (*http.Request, error) { // append resourceName if it is present if r.resourceName != nil { url += *r.resourceName + if r.subResource != nil { + url += "/" + *r.subResource + } } // append any query params @@ -202,6 +213,20 @@ func (r *Request) Do() *Response { return newResponse(res, err) } +// Raw performs a Raw HTTP request to the Kubernetes API +func (r *Request) Raw() (*http.Response, error) { + req, err := r.request() + if err != nil { + return nil, err + } + + res, err := r.client.Do(req) + if err != nil { + return nil, err + } + return res, nil +} + // Options ... type Options struct { Host string diff --git a/util/kubernetes/client/client.go b/util/kubernetes/client/client.go index 3680863f..821ee3da 100644 --- a/util/kubernetes/client/client.go +++ b/util/kubernetes/client/client.go @@ -4,6 +4,7 @@ import ( "bytes" "crypto/tls" "errors" + "io" "io/ioutil" "net/http" "os" @@ -116,6 +117,21 @@ func (c *client) Get(r *Resource, labels map[string]string) error { Into(r.Value) } +// Logs returns logs for a pod +func (c *client) Logs(podName string) (io.ReadCloser, error) { + req := api.NewRequest(c.opts). + Get(). + Resource("pod"). + SubResource("log"). + Name(podName) + + resp, err := req.Raw() + if err != nil { + return nil, err + } + return resp.Body, nil +} + // Update updates API object func (c *client) Update(r *Resource) error { req := api.NewRequest(c.opts). From c3607c23e728f87aa28d02185d3c5ce210392afe Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Tue, 17 Dec 2019 16:27:17 +0000 Subject: [PATCH 4/8] Fix after merge --- debug/log/kubernetes/kubernetes.go | 6 +++--- debug/log/kubernetes/kubernetes_test.go | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/debug/log/kubernetes/kubernetes.go b/debug/log/kubernetes/kubernetes.go index 529b5d7c..df8e2a6d 100644 --- a/debug/log/kubernetes/kubernetes.go +++ b/debug/log/kubernetes/kubernetes.go @@ -13,10 +13,10 @@ func (k *klog) Write(l log.Record) { write(l) } -func (k *klog) Stream(stop chan bool) <-chan log.Record { - c := make(chan log.Record) +func (k *klog) Stream() (<-chan log.Record, chan bool) { + c, s := make(chan log.Record), make(chan bool) go close(c) - return c + return c, s } // New returns a configured Kubernetes logger diff --git a/debug/log/kubernetes/kubernetes_test.go b/debug/log/kubernetes/kubernetes_test.go index c1eca93d..8fac8c08 100644 --- a/debug/log/kubernetes/kubernetes_test.go +++ b/debug/log/kubernetes/kubernetes_test.go @@ -41,11 +41,12 @@ func TestKubernetes(t *testing.T) { assert.Nil(t, k.Read(), "Read should be unimplemented") - stream := k.Stream(make(chan bool)) + stream, stop := k.Stream() records := []log.Record{} for s := range stream { records = append(records, s) } + close(stop) assert.Equal(t, 0, len(records), "Stream should be unimplemented") } From 51f4bc6d56fece260d9ffaeea937c1200afc53e8 Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Tue, 17 Dec 2019 16:30:09 +0000 Subject: [PATCH 5/8] Add logs to Interface --- util/kubernetes/client/kubernetes.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/util/kubernetes/client/kubernetes.go b/util/kubernetes/client/kubernetes.go index a9d3a653..8e30c923 100644 --- a/util/kubernetes/client/kubernetes.go +++ b/util/kubernetes/client/kubernetes.go @@ -2,6 +2,7 @@ package client import ( + "io" "strings" "github.com/micro/go-micro/util/log" @@ -24,6 +25,8 @@ type Kubernetes interface { Delete(*Resource) error // List lists API resources List(*Resource) error + // Logs gets logs from a pod + Logs(string) (io.ReadCloser, error) } // NewService returns default micro kubernetes service definition From c2b307e5bbde51459ba6e4fa07b95a22cec3466b Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Tue, 17 Dec 2019 17:08:31 +0000 Subject: [PATCH 6/8] Merge branch master of https://github.com/micro/go-micro into kubernetes-logging --- debug/log/log.go | 143 ----------------------------------------------- 1 file changed, 143 deletions(-) diff --git a/debug/log/log.go b/debug/log/log.go index 27e5193d..fdce331f 100644 --- a/debug/log/log.go +++ b/debug/log/log.go @@ -34,150 +34,7 @@ type Record struct { Metadata map[string]string `json:"metadata"` } -<<<<<<< HEAD -// Level is a log level -type Level int - -const ( - LevelFatal Level = iota - LevelError - LevelInfo - LevelWarn - LevelDebug - LevelTrace -) - -func init() { - switch os.Getenv("MICRO_LOG_LEVEL") { - case "trace": - DefaultLevel = LevelTrace - case "debug": - DefaultLevel = LevelDebug - case "warn": - DefaultLevel = LevelWarn - case "info": - DefaultLevel = LevelInfo - case "error": - DefaultLevel = LevelError - case "fatal": - DefaultLevel = LevelFatal - } -} - -func log(v ...interface{}) { - if len(prefix) > 0 { - DefaultLog.Write(Record{Value: fmt.Sprint(append([]interface{}{prefix, " "}, v...)...)}) - return - } - DefaultLog.Write(Record{Value: fmt.Sprint(v...)}) -} - -func logf(format string, v ...interface{}) { - if len(prefix) > 0 { - format = prefix + " " + format - } - DefaultLog.Write(Record{Value: fmt.Sprintf(format, v...)}) -} - -// WithLevel logs with the level specified -func WithLevel(l Level, v ...interface{}) { - if l > DefaultLevel { - return - } - log(v...) -} - -// WithLevel logs with the level specified -func WithLevelf(l Level, format string, v ...interface{}) { - if l > DefaultLevel { - return - } - logf(format, v...) -} - -// Trace provides trace level logging -func Trace(v ...interface{}) { - WithLevel(LevelTrace, v...) -} - -// Tracef provides trace level logging -func Tracef(format string, v ...interface{}) { - WithLevelf(LevelTrace, format, v...) -} - -// Debug provides debug level logging -func Debug(v ...interface{}) { - WithLevel(LevelDebug, v...) -} - -// Debugf provides debug level logging -func Debugf(format string, v ...interface{}) { - WithLevelf(LevelDebug, format, v...) -} - -// Warn provides warn level logging -func Warn(v ...interface{}) { - WithLevel(LevelWarn, v...) -} - -// Warnf provides warn level logging -func Warnf(format string, v ...interface{}) { - WithLevelf(LevelWarn, format, v...) -} - -// Info provides info level logging -func Info(v ...interface{}) { - WithLevel(LevelInfo, v...) -} - -// Infof provides info level logging -func Infof(format string, v ...interface{}) { - WithLevelf(LevelInfo, format, v...) -} - -// Error provides warn level logging -func Error(v ...interface{}) { - WithLevel(LevelError, v...) -} - -// Errorf provides warn level logging -func Errorf(format string, v ...interface{}) { - WithLevelf(LevelError, format, v...) -} - -// Fatal logs with Log and then exits with os.Exit(1) -func Fatal(v ...interface{}) { - WithLevel(LevelFatal, v...) - os.Exit(1) -} - -// Fatalf logs with Logf and then exits with os.Exit(1) -func Fatalf(format string, v ...interface{}) { - WithLevelf(LevelFatal, format, v...) - os.Exit(1) -} - -// SetLevel sets the log level -func SetLevel(l Level) { - DefaultLevel = l -} - -// GetLevel returns the current level -func GetLevel() Level { - return DefaultLevel -} - -// Set a prefix for the logger -func SetPrefix(p string) { - prefix = p -} - -// Set service name -func SetName(name string) { - prefix = fmt.Sprintf("[%s]", name) -======= type Stream interface { Chan() <-chan Record Stop() error ->>>>>>> 50d5c6402b1e2bea64476a969b613b7c685d6f8e } From 81e7edd666252a25df6536055924bdf9ad396c9d Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Tue, 17 Dec 2019 17:24:01 +0000 Subject: [PATCH 7/8] Adhere to new interfaces --- debug/log/kubernetes/kubernetes.go | 18 ++++++++++-------- debug/log/kubernetes/kubernetes_test.go | 14 +++++++++----- debug/log/kubernetes/log.go | 25 ++++++++++++++++++++++--- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/debug/log/kubernetes/kubernetes.go b/debug/log/kubernetes/kubernetes.go index df8e2a6d..56770a6e 100644 --- a/debug/log/kubernetes/kubernetes.go +++ b/debug/log/kubernetes/kubernetes.go @@ -2,21 +2,23 @@ package kubernetes import ( + "errors" + "github.com/micro/go-micro/debug/log" ) type klog struct{} -func (k *klog) Read(...log.ReadOption) []log.Record { return nil } - -func (k *klog) Write(l log.Record) { - write(l) +func (k *klog) Read(...log.ReadOption) ([]log.Record, error) { + return nil, errors.New("not implemented") } -func (k *klog) Stream() (<-chan log.Record, chan bool) { - c, s := make(chan log.Record), make(chan bool) - go close(c) - return c, s +func (k *klog) Write(l log.Record) error { + return write(l) +} + +func (k *klog) Stream() (log.Stream, error) { + return &klogStreamer{}, nil } // New returns a configured Kubernetes logger diff --git a/debug/log/kubernetes/kubernetes_test.go b/debug/log/kubernetes/kubernetes_test.go index 8fac8c08..3ba1cec3 100644 --- a/debug/log/kubernetes/kubernetes_test.go +++ b/debug/log/kubernetes/kubernetes_test.go @@ -39,14 +39,18 @@ func TestKubernetes(t *testing.T) { } assert.Equal(t, write, read, "Write was not equal") - assert.Nil(t, k.Read(), "Read should be unimplemented") + _, err = k.Read() + assert.Error(t, err, "Read should be unimplemented") - stream, stop := k.Stream() + stream, err := k.Stream() + if err != nil { + t.Error(err) + } records := []log.Record{} - for s := range stream { + go stream.Stop() + for s := range stream.Chan() { records = append(records, s) } - close(stop) - assert.Equal(t, 0, len(records), "Stream should be unimplemented") + assert.Equal(t, 0, len(records), "Stream should return nothing") } diff --git a/debug/log/kubernetes/log.go b/debug/log/kubernetes/log.go index ea352165..ad5740ea 100644 --- a/debug/log/kubernetes/log.go +++ b/debug/log/kubernetes/log.go @@ -8,8 +8,27 @@ import ( "os" ) -func write(l log.Record) { - if m, err := json.Marshal(l); err == nil { - fmt.Fprintf(os.Stderr, "%s", m) +func write(l log.Record) error { + m, err := json.Marshal(l) + if err == nil { + _, err := fmt.Fprintf(os.Stderr, "%s", m) + return err } + return err +} + +type klogStreamer struct { + streamChan chan log.Record +} + +func (k *klogStreamer) Chan() <-chan log.Record { + if k.streamChan == nil { + k.streamChan = make(chan log.Record) + } + return k.streamChan +} + +func (k *klogStreamer) Stop() error { + close(k.streamChan) + return nil } From f95bccce841aeb1b437a7144e3a4e60cefae75b2 Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Tue, 17 Dec 2019 17:36:01 +0000 Subject: [PATCH 8/8] Use UTC in tests --- debug/log/kubernetes/kubernetes_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debug/log/kubernetes/kubernetes_test.go b/debug/log/kubernetes/kubernetes_test.go index 3ba1cec3..70f2ea46 100644 --- a/debug/log/kubernetes/kubernetes_test.go +++ b/debug/log/kubernetes/kubernetes_test.go @@ -23,7 +23,7 @@ func TestKubernetes(t *testing.T) { os.Stderr = w meta := make(map[string]string) write := log.Record{ - Timestamp: time.Unix(0, 0), + Timestamp: time.Unix(0, 0).UTC(), Value: "Test log entry", Metadata: meta, }