Skip to content

Commit c9cde58

Browse files
committed
chore(refactor): Add functions to monitoring as they are instantiated
There is some stateful wonkery inside, because cdk-monitoring-constructs lacks functionality for influencing the layout of a dashboard
1 parent dc1e41f commit c9cde58

File tree

8 files changed

+42
-25
lines changed

8 files changed

+42
-25
lines changed

docs/constructs/assets/search.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/constructs/classes/BaseApi.html

Lines changed: 4 additions & 3 deletions
Large diffs are not rendered by default.

docs/constructs/classes/GraphQlApi.html

Lines changed: 4 additions & 3 deletions
Large diffs are not rendered by default.

docs/constructs/classes/RestApi.html

Lines changed: 4 additions & 3 deletions
Large diffs are not rendered by default.

src/constructs/base-api.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ export abstract class BaseApi extends Construct {
100100
protected readonly apiDomainName?: string;
101101
protected readonly apiFQDN?: string;
102102
public readonly monitoring?: MonitoringFacade;
103+
protected readonly functionMonitoring?: AggregatedFunctionMonitoring;
103104

104105
constructor(scope: Construct, id: string, props: BaseApiProps) {
105106
super(scope, id);
@@ -124,6 +125,11 @@ export abstract class BaseApi extends Construct {
124125
dashboardNamePrefix: props.apiName,
125126
}),
126127
});
128+
this.functionMonitoring = new AggregatedFunctionMonitoring(this.monitoring, {
129+
title: 'Lambda metrics',
130+
apiName: props.apiName,
131+
functions: {},
132+
});
127133
}
128134

129135
}
@@ -134,14 +140,12 @@ export abstract class BaseApi extends Construct {
134140
}
135141
}
136142

137-
protected addOperationFunctionMonitoring(apiName: string, functions: Record<string, IFunction>) {
138-
if (this.monitoring && Object.keys(functions).length > 0) {
139-
const functionMonitoring = new AggregatedFunctionMonitoring(this.monitoring, {
140-
title: 'Lambda metrics',
141-
apiName: apiName,
142-
functions: functions,
143+
protected addOperationFunctionMonitoring(functions: Record<string, IFunction>) {
144+
if (this.monitoring && this.functionMonitoring) {
145+
Object.entries(functions).forEach(([operationId, func]) => {
146+
this.functionMonitoring?.addFunction(operationId, func);
143147
});
144-
this.monitoring.addSegment(functionMonitoring);
148+
this.monitoring.addSegment(this.functionMonitoring);
145149
}
146150
}
147151

src/constructs/graphql.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ export class GraphQlApi<RESOLVERS> extends BaseApi {
152152
this.monitoring.monitorAppSyncApi({
153153
api: this.api,
154154
});
155-
this.addOperationFunctionMonitoring(props.apiName, this._functions);
155+
this.addOperationFunctionMonitoring({});
156156
if (props.singleTableDatastore) {
157157
this.addSingleTableMonitoring(props.singleTableDatastore);
158158
}
@@ -241,12 +241,9 @@ export class GraphQlApi<RESOLVERS> extends BaseApi {
241241
this._functions[operationId] = fn;
242242
Tags.of(fn).add('GraphQL', description);
243243

244-
// if (this.monitoring) {
245-
// this.monitoring.lambdaDurationsWidget.addLeftMetric(fn.metricDuration());
246-
// this.monitoring.lambdaInvokesWidget.addLeftMetric(fn.metricInvocations());
247-
// this.monitoring.lambdaErrorsWidget.addLeftMetric(fn.metricErrors());
248-
// this.monitoring.lambdaErrorsWidget.addLeftMetric(fn.metricThrottles());
249-
// }
244+
if (this.monitoring && this.functionMonitoring) {
245+
this.functionMonitoring.addFunction(operationId, fn);
246+
}
250247

251248
const dataSource = new aws_appsync.LambdaDataSource(this, `LambdaDS${operationId}`, {
252249
api: this.api,

src/constructs/monitoring/aggregated-function-monitoring.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ export class AggregatedFunctionMonitoring extends Monitoring {
3030
this._functions = props.functions;
3131
}
3232

33+
addFunction(operationId: string, func: IFunction) {
34+
if (Object.keys(this._functions).includes(operationId)) {
35+
throw new Error(`Operation '${operationId}' is being registered for monitoring twice!`);
36+
}
37+
this._functions[operationId] = func;
38+
console.log(`Added ${operationId}`);
39+
}
40+
3341
createTitleWidget() {
3442
const descriptionFile = `src/definitions/monitoring/${this.apiName}.description.md`;
3543
let description = `Create a file named '${descriptionFile}' to add a description to this API`;
@@ -79,6 +87,7 @@ export class AggregatedFunctionMonitoring extends Monitoring {
7987
}
8088

8189
widgets(): IWidget[] {
90+
console.log(`Adding widgets for fucntions ${Object.keys(this._functions).join(', ')}`);
8291
return [
8392
this.createTitleWidget(),
8493
new Row(

src/constructs/rest-api.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ export class RestApi<PATHS, OPS> extends BaseApi {
224224
});
225225

226226
// FIXME This currently depends on the side effects of having generated the routes further above
227-
this.addOperationFunctionMonitoring(props.apiName, this._functions);
227+
this.addOperationFunctionMonitoring({});
228228
if (props.singleTableDatastore) {
229229
this.addSingleTableMonitoring(props.singleTableDatastore);
230230
}
@@ -359,6 +359,10 @@ export class RestApi<PATHS, OPS> extends BaseApi {
359359
payloadFormatVersion: '1.0',
360360
};
361361

362+
if (this.monitoring && this.functionMonitoring) {
363+
this.functionMonitoring.addFunction(operation.operationId!, fn);
364+
}
365+
362366
return fn;
363367
}
364368

0 commit comments

Comments
 (0)