mirror of
https://github.com/rancher/plugins.git
synced 2025-07-10 05:34:02 +00:00
Bumps the golang group with 5 updates: | Package | From | To | | --- | --- | --- | | [github.com/Microsoft/hcsshim](https://github.com/Microsoft/hcsshim) | `0.11.4` | `0.12.0` | | [github.com/alexflint/go-filemutex](https://github.com/alexflint/go-filemutex) | `1.2.0` | `1.3.0` | | [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) | `2.13.2` | `2.16.0` | | [github.com/onsi/gomega](https://github.com/onsi/gomega) | `1.30.0` | `1.31.1` | | [golang.org/x/sys](https://github.com/golang/sys) | `0.15.0` | `0.17.0` | Updates `github.com/Microsoft/hcsshim` from 0.11.4 to 0.12.0 - [Release notes](https://github.com/Microsoft/hcsshim/releases) - [Commits](https://github.com/Microsoft/hcsshim/compare/v0.11.4...v0.12.0) Updates `github.com/alexflint/go-filemutex` from 1.2.0 to 1.3.0 - [Release notes](https://github.com/alexflint/go-filemutex/releases) - [Commits](https://github.com/alexflint/go-filemutex/compare/v1.2.0...v1.3.0) Updates `github.com/onsi/ginkgo/v2` from 2.13.2 to 2.16.0 - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.13.2...v2.16.0) Updates `github.com/onsi/gomega` from 1.30.0 to 1.31.1 - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.30.0...v1.31.1) Updates `golang.org/x/sys` from 0.15.0 to 0.17.0 - [Commits](https://github.com/golang/sys/compare/v0.15.0...v0.17.0) --- updated-dependencies: - dependency-name: github.com/Microsoft/hcsshim dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/alexflint/go-filemutex dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor dependency-group: golang ... Signed-off-by: dependabot[bot] <support@github.com>
116 lines
3.4 KiB
Go
116 lines
3.4 KiB
Go
package log
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net"
|
|
"reflect"
|
|
"time"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"google.golang.org/protobuf/encoding/protojson"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
// TimeFormat is [time.RFC3339Nano] with nanoseconds padded using
|
|
// zeros to ensure the formatted time is always the same number of
|
|
// characters.
|
|
// Based on RFC3339NanoFixed from github.com/containerd/log
|
|
const TimeFormat = "2006-01-02T15:04:05.000000000Z07:00"
|
|
|
|
func FormatTime(t time.Time) string {
|
|
return t.Format(TimeFormat)
|
|
}
|
|
|
|
// DurationFormat formats a [time.Duration] log entry.
|
|
//
|
|
// A nil value signals an error with the formatting.
|
|
type DurationFormat func(time.Duration) interface{}
|
|
|
|
func DurationFormatString(d time.Duration) interface{} { return d.String() }
|
|
func DurationFormatSeconds(d time.Duration) interface{} { return d.Seconds() }
|
|
func DurationFormatMilliseconds(d time.Duration) interface{} { return d.Milliseconds() }
|
|
|
|
// FormatIO formats net.Conn and other types that have an `Addr()` or `Name()`.
|
|
//
|
|
// See FormatEnabled for more information.
|
|
func FormatIO(ctx context.Context, v interface{}) string {
|
|
m := make(map[string]string)
|
|
m["type"] = reflect.TypeOf(v).String()
|
|
|
|
switch t := v.(type) {
|
|
case net.Conn:
|
|
m["localAddress"] = formatAddr(t.LocalAddr())
|
|
m["remoteAddress"] = formatAddr(t.RemoteAddr())
|
|
case interface{ Addr() net.Addr }:
|
|
m["address"] = formatAddr(t.Addr())
|
|
default:
|
|
return Format(ctx, t)
|
|
}
|
|
|
|
return Format(ctx, m)
|
|
}
|
|
|
|
func formatAddr(a net.Addr) string {
|
|
return a.Network() + "://" + a.String()
|
|
}
|
|
|
|
// Format formats an object into a JSON string, without any indendtation or
|
|
// HTML escapes.
|
|
// Context is used to output a log waring if the conversion fails.
|
|
//
|
|
// This is intended primarily for `trace.StringAttribute()`
|
|
func Format(ctx context.Context, v interface{}) string {
|
|
b, err := encode(v)
|
|
if err != nil {
|
|
// logging errors aren't really warning worthy, and can potentially spam a lot of logs out
|
|
G(ctx).WithFields(logrus.Fields{
|
|
logrus.ErrorKey: err,
|
|
"type": fmt.Sprintf("%T", v),
|
|
}).Debug("could not format value")
|
|
return ""
|
|
}
|
|
|
|
return string(b)
|
|
}
|
|
|
|
func encode(v interface{}) (_ []byte, err error) {
|
|
if m, ok := v.(proto.Message); ok {
|
|
// use canonical JSON encoding for protobufs (instead of [encoding/json])
|
|
// https://protobuf.dev/programming-guides/proto3/#json
|
|
var b []byte
|
|
b, err = protojson.MarshalOptions{
|
|
AllowPartial: true,
|
|
// protobuf defaults to camel case for JSON encoding; use proto field name instead (snake case)
|
|
UseProtoNames: true,
|
|
}.Marshal(m)
|
|
if err == nil {
|
|
// the protojson marshaller tries to unmarshal anypb.Any fields, which can
|
|
// fail for types encoded with "github.com/containerd/typeurl/v2"
|
|
// we can try creating a dedicated protoregistry.MessageTypeResolver that uses typeurl, but, its
|
|
// more robust to fall back on json marshalling for errors in general
|
|
return b, nil
|
|
}
|
|
|
|
}
|
|
|
|
buf := &bytes.Buffer{}
|
|
enc := json.NewEncoder(buf)
|
|
enc.SetEscapeHTML(false)
|
|
enc.SetIndent("", "")
|
|
|
|
if jErr := enc.Encode(v); jErr != nil {
|
|
if err != nil {
|
|
// TODO (go1.20): use multierror via fmt.Errorf("...: %w; ...: %w", ...)
|
|
//nolint:errorlint // non-wrapping format verb for fmt.Errorf
|
|
return nil, fmt.Errorf("protojson encoding: %v; json encoding: %w", err, jErr)
|
|
}
|
|
return nil, fmt.Errorf("json encoding: %w", jErr)
|
|
}
|
|
|
|
// encoder.Encode appends a newline to the end
|
|
return bytes.TrimSpace(buf.Bytes()), nil
|
|
}
|