Skip to content

Commit 8a30251

Browse files
committed
Allow user to not use default dimensions
1 parent e4d4fd5 commit 8a30251

File tree

4 files changed

+100
-36
lines changed

4 files changed

+100
-36
lines changed

Diff for: emf/logger.go

+45-34
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ import (
1111

1212
// Logger for metrics with default Context.
1313
type Logger struct {
14-
out io.Writer
15-
timestamp int64
16-
defaultContext Context
17-
contexts []*Context
18-
values map[string]interface{}
14+
out io.Writer
15+
timestamp int64
16+
defaultContext Context
17+
contexts []*Context
18+
values map[string]interface{}
19+
withoutDimensions bool
1920
}
2021

2122
// Context gives ability to add another MetricDirective section for Logger.
@@ -41,21 +42,40 @@ func WithTimestamp(t time.Time) LoggerOption {
4142
}
4243
}
4344

45+
// WithoutDimensions ignores default AWS Lambda related properties and dimensions.
46+
func WithoutDimensions() LoggerOption {
47+
return func(l *Logger) {
48+
l.withoutDimensions = true
49+
}
50+
}
51+
4452
// New creates logger with reasonable defaults for Lambda functions:
4553
// - Prints to os.Stdout.
4654
// - Context based on Lambda environment variables.
4755
// - Timestamp set to the time when New was called.
4856
// Specify LoggerOptions to customize the logger.
4957
func New(opts ...LoggerOption) *Logger {
58+
l := Logger{
59+
out: os.Stdout,
60+
timestamp: time.Now().UnixNano() / int64(time.Millisecond),
61+
}
62+
63+
// apply any options
64+
for _, opt := range opts {
65+
opt(&l)
66+
}
67+
5068
values := make(map[string]interface{})
5169

52-
// set default properties for lambda function
53-
fnName := os.Getenv("AWS_LAMBDA_FUNCTION_NAME")
54-
if fnName != "" {
55-
values["executionEnvironment"] = os.Getenv("AWS_EXECUTION_ENV")
56-
values["memorySize"] = os.Getenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE")
57-
values["functionVersion"] = os.Getenv("AWS_LAMBDA_FUNCTION_VERSION")
58-
values["logStreamId"] = os.Getenv("AWS_LAMBDA_LOG_STREAM_NAME")
70+
if !l.withoutDimensions {
71+
// set default properties for lambda function
72+
fnName := os.Getenv("AWS_LAMBDA_FUNCTION_NAME")
73+
if fnName != "" {
74+
values["executionEnvironment"] = os.Getenv("AWS_EXECUTION_ENV")
75+
values["memorySize"] = os.Getenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE")
76+
values["functionVersion"] = os.Getenv("AWS_LAMBDA_FUNCTION_VERSION")
77+
values["logStreamId"] = os.Getenv("AWS_LAMBDA_LOG_STREAM_NAME")
78+
}
5979
}
6080

6181
// only collect traces which have been sampled
@@ -64,20 +84,10 @@ func New(opts ...LoggerOption) *Logger {
6484
values["traceId"] = amznTraceID
6585
}
6686

67-
// create a default logger
68-
l := &Logger{
69-
out: os.Stdout,
70-
defaultContext: newContext(values),
71-
values: values,
72-
timestamp: time.Now().UnixNano() / int64(time.Millisecond),
73-
}
87+
l.values = values
88+
l.defaultContext = newContext(values, l.withoutDimensions)
7489

75-
// apply any options
76-
for _, opt := range opts {
77-
opt(l)
78-
}
79-
80-
return l
90+
return &l
8191
}
8292

8393
// Dimension helps builds DimensionSet.
@@ -201,7 +211,7 @@ func (l *Logger) Log() {
201211

202212
// NewContext creates new context for given logger.
203213
func (l *Logger) NewContext() *Context {
204-
c := newContext(l.values)
214+
c := newContext(l.values, l.withoutDimensions)
205215
l.contexts = append(l.contexts, &c)
206216
return &c
207217
}
@@ -250,15 +260,16 @@ func (c *Context) MetricFloatAs(name string, value float64, unit MetricUnit) *Co
250260
return c.put(name, value, unit)
251261
}
252262

253-
func newContext(values map[string]interface{}) Context {
263+
func newContext(values map[string]interface{}, withoutDimensions bool) Context {
254264
var defaultDimensions []DimensionSet
255-
256-
// set default dimensions for lambda function
257-
fnName := os.Getenv("AWS_LAMBDA_FUNCTION_NAME")
258-
if fnName != "" {
259-
defaultDimensions = []DimensionSet{{"ServiceName", "ServiceType"}}
260-
values["ServiceType"] = "AWS::Lambda::Function"
261-
values["ServiceName"] = fnName
265+
if !withoutDimensions {
266+
// set default dimensions for lambda function
267+
fnName := os.Getenv("AWS_LAMBDA_FUNCTION_NAME")
268+
if fnName != "" {
269+
defaultDimensions = []DimensionSet{{"ServiceName", "ServiceType"}}
270+
values["ServiceType"] = "AWS::Lambda::Function"
271+
values["ServiceName"] = fnName
272+
}
262273
}
263274

264275
return Context{

Diff for: emf/logger_internal_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ func TestNew(t *testing.T) {
3131
timestamp: time.Now().Add(time.Hour).UnixNano() / int64(time.Millisecond),
3232
},
3333
},
34+
{
35+
name: "without dimensions",
36+
opts: []LoggerOption{
37+
WithoutDimensions(),
38+
},
39+
expected: &Logger{
40+
out: os.Stdout,
41+
timestamp: time.Now().UnixNano() / int64(time.Millisecond),
42+
withoutDimensions: false,
43+
},
44+
},
3445
}
3546

3647
for _, tc := range tcs {

Diff for: emf/logger_test.go

+26-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ import (
1313
func TestEmf(t *testing.T) {
1414
tcs := []struct {
1515
name string
16+
new func(*bytes.Buffer) *emf.Logger
1617
env map[string]string
17-
given func(logger *emf.Logger)
18+
given func(*emf.Logger)
1819
expected string
1920
}{
2021
{
@@ -171,6 +172,23 @@ func TestEmf(t *testing.T) {
171172
},
172173
expected: "testdata/16.json",
173174
},
175+
{
176+
name: "default properties and dimensions for lambda are ignored",
177+
new: func(buf *bytes.Buffer) *emf.Logger {
178+
return emf.New(emf.WithoutDimensions(), emf.WithWriter(buf))
179+
},
180+
env: map[string]string{
181+
"AWS_LAMBDA_FUNCTION_NAME": "some-func-name",
182+
"AWS_EXECUTION_ENV": "golang",
183+
"AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "128",
184+
"AWS_LAMBDA_FUNCTION_VERSION": "1",
185+
"AWS_LAMBDA_LOG_STREAM_NAME": "log/stream",
186+
},
187+
given: func(logger *emf.Logger) {
188+
logger.Metric("foo", 33)
189+
},
190+
expected: "testdata/17.json",
191+
},
174192
}
175193

176194
for _, tc := range tcs {
@@ -181,10 +199,16 @@ func TestEmf(t *testing.T) {
181199
}
182200

183201
var buf bytes.Buffer
184-
logger := emf.New(emf.WithWriter(&buf))
202+
var logger *emf.Logger
203+
if tc.new != nil {
204+
logger = tc.new(&buf)
205+
} else {
206+
logger = emf.New(emf.WithWriter(&buf))
207+
}
185208
tc.given(logger)
186209
logger.Log()
187210

211+
println(buf.String())
188212
f, err := ioutil.ReadFile(tc.expected)
189213
if err != nil {
190214
t.Fatal("unable to read file with expected json")

Diff for: emf/testdata/17.json

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"_aws": {
3+
"Timestamp": "<<PRESENCE>>",
4+
"CloudWatchMetrics": [
5+
{
6+
"Metrics": [
7+
{
8+
"Name": "foo",
9+
"Unit": "None"
10+
}
11+
],
12+
"Namespace": "aws-embedded-metrics",
13+
"Dimensions": null
14+
}
15+
]
16+
},
17+
"foo": 33
18+
}

0 commit comments

Comments
 (0)