Skip to content
Snippets Groups Projects
Commit ff905f68 authored by Semyon Krestyaninov's avatar Semyon Krestyaninov
Browse files

Merge branch 'fix/PRXS-951-1964-FixZapCustomFields' into feature/PRXS-951-1961-ZapIntergration

# Conflicts:
#	log/zap/field.go
parents cb2f77c0 f7c416a9
No related branches found
No related tags found
No related merge requests found
...@@ -2,78 +2,72 @@ package zap ...@@ -2,78 +2,72 @@ package zap
import ( import (
"context" "context"
"fmt"
"git.perx.ru/perxis/perxis-go/id" "git.perx.ru/perxis/perxis-go/id"
_ "git.perx.ru/perxis/perxis-go/id/system" // регистрируем обработчики для системных объектов
"git.perx.ru/perxis/perxis-go/pkg/auth" "git.perx.ru/perxis/perxis-go/pkg/auth"
"go.uber.org/zap" "go.uber.org/zap"
"go.uber.org/zap/zapcore"
) )
const ( func Category(category string) zap.Field {
unknownObject = "unknown" if category == "" {
unknownCaller = "unknown" return zap.Skip()
) }
func Category(category string) zapcore.Field {
return zap.String("category", category) return zap.String("category", category)
} }
func Component(component string) zapcore.Field { func Component(component string) zap.Field {
if component == "" {
return zap.Skip()
}
return zap.String("component", component) return zap.String("component", component)
} }
func Event(event string) zapcore.Field { func Event(event string) zap.Field {
if event == "" {
return zap.Skip()
}
return zap.String("event", event) return zap.String("event", event)
} }
// Object возвращает поле и устанавливает передаваемый аргумент в качестве идентификатора объекта в формате ObjectID. // ObjectID возвращает поле и устанавливает передаваемый аргумент в качестве идентификатора объекта в формате ObjectId.
// Поддерживаемые типы: string, fmt.Stringer. // Поддерживает типы в формате ObjectId: string, map[string]any, системные объекты.
// Если передан аргумент другого типа, будет произведена попытка привести переданное значение к ObjectID. func ObjectID(v any) zap.Field {
func Object(v any) zapcore.Field { oid, err := id.NewObjectId(v)
var object = unknownObject if err != nil {
switch value := v.(type) { return zap.Skip()
case string: }
object = value return zap.Reflect("object_id", oid)
case fmt.Stringer:
object = value.String()
default:
oid, err := id.FromObject(v)
if err == nil {
object = oid.String()
}
}
return zap.String("object", object)
} }
// Caller возвращает поле и устанавливает передаваемый аргумент в качестве "вызывающего" в формате ObjectID. // CallerID возвращает поле и устанавливает передаваемый аргумент в качестве "вызывающего" в формате ObjectId.
// Поддерживаемые типы: string, fmt.Stringer. // Поддерживает типы в формате ObjectId: string, map[string]any, системные объекты.
// Если передан аргумент другого типа, будет произведена попытка привести переданное значение к ObjectID. func CallerID(v any) zap.Field {
func Caller(v any) zapcore.Field { oid, err := id.NewObjectId(v)
var caller = unknownCaller if err != nil {
switch value := v.(type) { return zap.Skip()
case string: }
caller = value return zap.Reflect("caller_id", oid)
case fmt.Stringer:
caller = value.String()
default:
oid, err := id.FromObject(v)
if err == nil {
caller = oid.String()
}
}
return zap.String("caller", caller)
} }
// CallerFromContext извлекает auth.Principal из контекста и устанавливает его в качестве "вызывающего" в формате ObjectID. // CallerIDFromContext извлекает auth.Principal из контекста и устанавливает его в качестве "вызывающего" в формате ObjectID.
func CallerFromContext(ctx context.Context) zapcore.Field { func CallerIDFromContext(ctx context.Context) zap.Field {
return Caller(auth.GetPrincipal(ctx)) if ctx == nil {
return zap.Skip()
}
return CallerID(auth.GetPrincipal(ctx))
} }
func Attr(attr any) zapcore.Field { func Attr(attr any) zap.Field {
if attr == nil {
return zap.Skip()
}
return zap.Any("attr", attr) return zap.Any("attr", attr)
} }
func Tags(tags ...string) zapcore.Field { func Tags(tags ...string) zap.Field {
if len(tags) == 0 {
return zap.Skip()
}
return zap.Strings("tags", tags) return zap.Strings("tags", tags)
} }
package zap
import (
"context"
"testing"
"git.perx.ru/perxis/perxis-go/id"
"git.perx.ru/perxis/perxis-go/pkg/auth"
"git.perx.ru/perxis/perxis-go/pkg/items"
"git.perx.ru/perxis/perxis-go/pkg/users"
"github.com/stretchr/testify/assert"
"go.uber.org/zap"
)
func TestCategory(t *testing.T) {
tests := []struct {
name string
field zap.Field
want zap.Field
}{
{name: "ok", field: Category("update"), want: zap.String("category", "update")},
{name: "invalid", field: Category(""), want: zap.Skip()},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
assert.True(t, tc.want.Equals(tc.field))
})
}
}
func TestComponent(t *testing.T) {
tests := []struct {
name string
field zap.Field
want zap.Field
}{
{name: "ok", field: Component("Items"), want: zap.String("component", "Items")},
{name: "invalid", field: Component(""), want: zap.Skip()},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
assert.True(t, tc.want.Equals(tc.field))
})
}
}
func TestEvent(t *testing.T) {
tests := []struct {
name string
field zap.Field
want zap.Field
}{
{name: "ok", field: Event("items.create"), want: zap.String("event", "items.create")},
{name: "invalid", field: Event(""), want: zap.Skip()},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
assert.True(t, tc.want.Equals(tc.field))
})
}
}
func TestObjectID(t *testing.T) {
item := &items.Item{
ID: "c4ca4238a0b923820dcc509a6f75849b",
SpaceID: "c81e728d9d4c2f636f067f89cc14862c",
EnvID: "eccbc87e4b5ce2fe28308fd9f2a7baf3",
CollectionID: "a87ff679a2f3e71d9181a67b7542122c",
}
oid := id.MustObjectId(item)
itemId := id.NewItemId(*item)
tests := []struct {
name string
field zap.Field
want zap.Field
}{
{name: "system object", field: ObjectID(item), want: zap.Reflect("object_id", oid)},
{name: "object id", field: ObjectID(itemId), want: zap.Reflect("object_id", oid)},
{name: "string", field: ObjectID(oid.String()), want: zap.Reflect("object_id", oid)},
{name: "invalid", field: ObjectID(nil), want: zap.Skip()},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
if tc.want.Equals(zap.Skip()) {
assert.True(t, tc.want.Equals(tc.field))
return
}
assert.Equal(t, tc.want.Interface.(id.Descriptor).String(), tc.field.Interface.(id.Descriptor).String())
})
}
}
func TestCallerID(t *testing.T) {
user := &users.User{
ID: "c4ca4238a0b923820dcc509a6f75849b",
}
oid := id.MustObjectId(user)
userId := id.NewUserId(*user)
tests := []struct {
name string
field zap.Field
want zap.Field
}{
{name: "system object", field: CallerID(user), want: zap.Reflect("caller_id", oid)},
{name: "object id", field: CallerID(userId), want: zap.Reflect("caller_id", oid)},
{name: "string", field: CallerID(oid.String()), want: zap.Reflect("caller_id", oid)},
{name: "invalid", field: CallerID(nil), want: zap.Skip()},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
if tc.want.Equals(zap.Skip()) {
assert.True(t, tc.want.Equals(tc.field))
return
}
assert.Equal(t, tc.want.Interface.(id.Descriptor).String(), tc.field.Interface.(id.Descriptor).String())
})
}
}
func TestCallerIDFromContext(t *testing.T) {
ctx := auth.WithSystem(context.Background())
oid := id.MustObjectId(auth.GetPrincipal(ctx))
tests := []struct {
name string
field zap.Field
want zap.Field
}{
{name: "ok", field: CallerIDFromContext(ctx), want: zap.Reflect("caller_id", oid)},
{name: "invalid", field: CallerIDFromContext(nil), want: zap.Skip()},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
if tc.want.Equals(zap.Skip()) {
assert.True(t, tc.want.Equals(tc.field))
return
}
assert.Equal(t, tc.want.Interface.(id.Descriptor).String(), tc.field.Interface.(id.Descriptor).String())
})
}
}
func TestAttr(t *testing.T) {
tests := []struct {
name string
field zap.Field
want zap.Field
}{
{name: "ok", field: Attr(map[string]string{"a": "b"}), want: zap.Reflect("attr", map[string]string{"a": "b"})},
{name: "invalid", field: Attr(nil), want: zap.Skip()},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
assert.True(t, tc.want.Equals(tc.field))
})
}
}
func TestTags(t *testing.T) {
tests := []struct {
name string
field zap.Field
want zap.Field
}{
{name: "ok", field: Tags("a", "b", "c"), want: zap.Strings("tags", []string{"a", "b", "c"})},
{name: "invalid", field: Tags(nil...), want: zap.Skip()},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
assert.True(t, tc.want.Equals(tc.field))
})
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment