Skip to content

Commit 9c1644d

Browse files
committed
docs(metrics): logMetric middleware and examples
1 parent 79e5aae commit 9c1644d

25 files changed

+647
-245
lines changed

docs/core/metrics.md

Lines changed: 238 additions & 91 deletions
Large diffs are not rendered by default.

packages/metrics/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Metrics has two global settings that will be used across all metrics emitted:
2424

2525
|Setting|Description|Environment Variable|Constructor Parameter|
2626
|---|---|---|---|
27-
|Metric namespace|Logical container where all metrics will be placed e.g. ServerlessAirline|POWERTOOLS_METRICS_NAMESPACE|namespace|
27+
|Metric namespace|Logical container where all metrics will be placed e.g. serverlessAirline|POWERTOOLS_METRICS_NAMESPACE|namespace|
2828
|Service|Optionally, sets service metric dimension across all metrics e.g. payment|POWERTOOLS_SERVICE_NAME|service|
2929

3030
```typescript
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
22
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
3-
import { LambdaInterface } from './utils/lambda/LambdaInterface';
43
import { populateEnvironmentVariables } from '../tests/helpers';
5-
import { Callback, Context } from 'aws-lambda/handler';
64
import { Metrics, MetricUnits } from '../src';
5+
import middy from '@middy/core';
6+
import { logMetrics } from '../src/middleware/middy';
77

88
// Populate runtime
99
populateEnvironmentVariables();
@@ -12,15 +12,15 @@ process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
1212

1313
const metrics = new Metrics();
1414

15-
class Lambda implements LambdaInterface {
15+
const lambdaHandler = async (): Promise<void> => {
1616

17-
@metrics.logMetrics({ captureColdStartMetric: true })
18-
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
19-
metrics.addDimension('OuterDimension', 'true');
20-
metrics.addMetric('test-metric', MetricUnits.Count, 10);
21-
}
17+
metrics.addDimension('custom-dimension', 'true');
18+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
2219

23-
}
20+
};
2421

25-
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
26-
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked again!'));
22+
const handlerWithMiddleware = middy(lambdaHandler)
23+
.use(logMetrics(metrics, { captureColdStartMetric: true }));
24+
25+
handlerWithMiddleware(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
26+
handlerWithMiddleware(dummyEvent, dummyContext, () => console.log('Lambda invoked again!'));
Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
22
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
3+
import { populateEnvironmentVariables } from '../tests/helpers';
34
import { Metrics, MetricUnits } from '../src';
4-
import { LambdaInterface } from "./utils/lambda";
5-
import { Callback, Context } from "aws-lambda/handler";
5+
import middy from '@middy/core';
6+
import { logMetrics } from '../src/middleware/middy';
7+
8+
// Populate runtime
9+
populateEnvironmentVariables();
10+
// Additional runtime variables
11+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
612

713
const metrics = new Metrics({
814
namespace: 'hello-world-constructor',
915
service: 'hello-world-service-constructor'
1016
});
1117

12-
class Lambda implements LambdaInterface {
13-
14-
@metrics.logMetrics()
15-
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
16-
metrics.addMetric('test-metric', MetricUnits.Count, 10);
18+
const lambdaHandler = async (): Promise<void> => {
19+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
20+
};
1721

18-
}
22+
const handlerWithMiddleware = middy(lambdaHandler)
23+
.use(logMetrics(metrics));
1924

20-
}
21-
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
25+
handlerWithMiddleware(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
2+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
3+
import { LambdaInterface } from './utils/lambda/LambdaInterface';
4+
import { populateEnvironmentVariables } from '../tests/helpers';
5+
import { Callback, Context } from 'aws-lambda/handler';
6+
import { Metrics, MetricUnits } from '../src';
7+
8+
// Populate runtime
9+
populateEnvironmentVariables();
10+
// Additional runtime variables
11+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
12+
13+
const metrics = new Metrics();
14+
15+
class Lambda implements LambdaInterface {
16+
17+
@metrics.logMetrics({ captureColdStartMetric: true })
18+
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
19+
metrics.addDimension('OuterDimension', 'true');
20+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
21+
}
22+
23+
}
24+
25+
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
26+
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked again!'));
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
2+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
3+
import { Metrics, MetricUnits } from '../src';
4+
import { LambdaInterface } from "./utils/lambda";
5+
import { Callback, Context } from "aws-lambda/handler";
6+
7+
const metrics = new Metrics({
8+
namespace: 'hello-world-constructor',
9+
service: 'hello-world-service-constructor'
10+
});
11+
12+
class Lambda implements LambdaInterface {
13+
14+
@metrics.logMetrics()
15+
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
16+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
17+
18+
}
19+
20+
}
21+
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { populateEnvironmentVariables } from '../tests/helpers';
2+
3+
// Populate runtime
4+
populateEnvironmentVariables();
5+
// Additional runtime variables
6+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world-constructor';
7+
process.env.POWERTOOLS_SERVICE_NAME = 'hello-world-service-constructor';
8+
9+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
10+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
11+
import { LambdaInterface } from './utils/lambda/LambdaInterface';
12+
import { Callback, Context } from 'aws-lambda/handler';
13+
import { Metrics, MetricUnits } from '../src';
14+
15+
const metrics = new Metrics({ defaultDimensions:{ 'application': 'hello-world' } });
16+
17+
class Lambda implements LambdaInterface {
18+
19+
@metrics.logMetrics()
20+
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
21+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
22+
23+
}
24+
25+
}
26+
27+
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { populateEnvironmentVariables } from '../tests/helpers';
2+
3+
// Populate runtime
4+
populateEnvironmentVariables();
5+
// Additional runtime variables
6+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
7+
8+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
9+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
10+
import { LambdaInterface } from './utils/lambda/LambdaInterface';
11+
import { Callback, Context } from 'aws-lambda/handler';
12+
import { Metrics, MetricUnits } from '../src';
13+
14+
const metrics = new Metrics();
15+
16+
class Lambda implements LambdaInterface {
17+
18+
@metrics.logMetrics({ defaultDimensions:{ 'application': 'hello-world' } })
19+
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
20+
21+
metrics.addDimension('environment', 'dev');
22+
metrics.addDimension('application', 'hello-world-dev');
23+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
24+
const metricsObject = metrics.serializeMetrics();
25+
metrics.clearMetrics();
26+
metrics.clearDimensions();
27+
metrics.addMetric('new-test-metric', MetricUnits.Count, 5);
28+
console.log(JSON.stringify(metricsObject));
29+
}
30+
31+
}
32+
33+
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { populateEnvironmentVariables } from '../tests/helpers';
2+
3+
// Populate runtime
4+
populateEnvironmentVariables();
5+
// Additional runtime variables
6+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
7+
8+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
9+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
10+
import { LambdaInterface } from './utils/lambda/LambdaInterface';
11+
import { Callback, Context } from 'aws-lambda/handler';
12+
import { Metrics, MetricUnits } from '../src';
13+
14+
const metrics = new Metrics();
15+
16+
class Lambda implements LambdaInterface {
17+
18+
@metrics.logMetrics()
19+
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
20+
21+
metrics.addDimension('environment', 'dev');
22+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
23+
24+
}
25+
26+
}
27+
28+
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { populateEnvironmentVariables } from '../tests/helpers';
2+
3+
// Populate runtime
4+
populateEnvironmentVariables();
5+
// Additional runtime variables
6+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
7+
8+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
9+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
10+
import { LambdaInterface } from './utils/lambda/LambdaInterface';
11+
import { Callback, Context } from 'aws-lambda/handler';
12+
import { Metrics } from '../src';
13+
14+
const metrics = new Metrics();
15+
16+
class Lambda implements LambdaInterface {
17+
18+
@metrics.logMetrics({ raiseOnEmptyMetrics: true })
19+
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
20+
21+
}
22+
23+
}
24+
25+
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { populateEnvironmentVariables } from '../tests/helpers';
2+
3+
// Populate runtime
4+
populateEnvironmentVariables();
5+
// Additional runtime variables
6+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
7+
process.env.POWERTOOLS_SERVICE_NAME = 'hello-world-service';
8+
9+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
10+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
11+
import { LambdaInterface } from './utils/lambda/LambdaInterface';
12+
import { Callback, Context } from 'aws-lambda/handler';
13+
import { Metrics, MetricUnits } from '../src';
14+
15+
const metrics = new Metrics();
16+
17+
class Lambda implements LambdaInterface {
18+
19+
@metrics.logMetrics()
20+
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
21+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
22+
23+
}
24+
25+
}
26+
27+
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { populateEnvironmentVariables } from '../tests/helpers';
2+
3+
// Populate runtime
4+
populateEnvironmentVariables();
5+
// Additional runtime variables
6+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
7+
8+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
9+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
10+
import { Handler } from 'aws-lambda';
11+
import { Metrics, MetricUnits } from '../src';
12+
13+
const metrics = new Metrics();
14+
15+
const lambdaHandler: Handler = async () => {
16+
17+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
18+
metrics.purgeStoredMetrics();
19+
//Metrics will be logged and cleared
20+
21+
return {
22+
foo: 'bar'
23+
};
24+
25+
};
26+
27+
lambdaHandler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { populateEnvironmentVariables } from '../tests/helpers';
2+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
3+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
4+
import { LambdaInterface } from './utils/lambda/LambdaInterface';
5+
import { Callback, Context } from 'aws-lambda/handler';
6+
import { Metrics, MetricUnits } from '../src';
7+
8+
// Populate runtime
9+
populateEnvironmentVariables();
10+
// Additional runtime variables
11+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
12+
13+
const metrics = new Metrics();
14+
15+
class Lambda implements LambdaInterface {
16+
17+
@metrics.logMetrics()
18+
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
19+
const singleMetric = metrics.singleMetric();
20+
metrics.addDimension('OuterDimension', 'true');
21+
singleMetric.addDimension('InnerDimension', 'true');
22+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
23+
singleMetric.addMetric('single-metric', MetricUnits.Percent, 50);
24+
}
25+
26+
}
27+
28+
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
1+
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
2+
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
13
import { populateEnvironmentVariables } from '../tests/helpers';
4+
import { Metrics, MetricUnits } from '../src';
5+
import middy from '@middy/core';
6+
import { logMetrics } from '../src/middleware/middy';
27

38
// Populate runtime
49
populateEnvironmentVariables();
510
// Additional runtime variables
6-
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world-constructor';
7-
process.env.POWERTOOLS_SERVICE_NAME = 'hello-world-service-constructor';
8-
9-
import * as dummyEvent from '../../../tests/resources/events/custom/hello-world.json';
10-
import { context as dummyContext } from '../../../tests/resources/contexts/hello-world';
11-
import { LambdaInterface } from './utils/lambda/LambdaInterface';
12-
import { Callback, Context } from 'aws-lambda/handler';
13-
import { Metrics, MetricUnits } from '../src';
14-
15-
const metrics = new Metrics({ defaultDimensions:{ 'application': 'hello-world' } });
16-
17-
class Lambda implements LambdaInterface {
11+
process.env.POWERTOOLS_METRICS_NAMESPACE = 'hello-world';
1812

19-
@metrics.logMetrics()
20-
public handler<TEvent, TResult>(_event: TEvent, _context: Context, _callback: Callback<TResult>): void | Promise<TResult> {
21-
metrics.addMetric('test-metric', MetricUnits.Count, 10);
13+
const metrics = new Metrics({ defaultDimensions:{ 'application': 'my-application' } });
2214

23-
}
15+
const lambdaHandler = async (): Promise<void> => {
16+
metrics.addMetric('test-metric', MetricUnits.Count, 10);
17+
};
2418

25-
}
19+
const handlerWithMiddleware = middy(lambdaHandler)
20+
.use(logMetrics(metrics));
2621

27-
new Lambda().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));
22+
handlerWithMiddleware(dummyEvent, dummyContext, () => console.log('Lambda invoked!'));

0 commit comments

Comments
 (0)