serverless-plugin-datadog 3.3.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. package/dist/env.d.ts +17 -0
  2. package/dist/env.d.ts.map +1 -0
  3. package/dist/env.js +63 -0
  4. package/dist/env.js.map +1 -0
  5. package/dist/forwarder.d.ts +14 -0
  6. package/dist/forwarder.d.ts.map +1 -0
  7. package/dist/forwarder.js +87 -0
  8. package/dist/forwarder.js.map +1 -0
  9. package/dist/index.d.ts +10 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +161 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/layer.d.ts +26 -0
  14. package/dist/layer.d.ts.map +1 -0
  15. package/dist/layer.js +65 -0
  16. package/dist/layer.js.map +1 -0
  17. package/dist/layers.json +156 -0
  18. package/dist/package.json +1 -1
  19. package/dist/src/layer.d.ts.map +1 -1
  20. package/dist/src/layer.js +1 -2
  21. package/dist/src/layer.js.map +1 -1
  22. package/dist/src/layers-gov.json +4 -4
  23. package/dist/src/layers.json +42 -42
  24. package/dist/templates/node-es6-template.d.ts +2 -0
  25. package/dist/templates/node-es6-template.d.ts.map +1 -0
  26. package/dist/templates/node-es6-template.js +25 -0
  27. package/dist/templates/node-es6-template.js.map +1 -0
  28. package/dist/templates/node-js-template.d.ts +2 -0
  29. package/dist/templates/node-js-template.d.ts.map +1 -0
  30. package/dist/templates/node-js-template.js +24 -0
  31. package/dist/templates/node-js-template.js.map +1 -0
  32. package/dist/templates/node-ts-template.d.ts +2 -0
  33. package/dist/templates/node-ts-template.d.ts.map +1 -0
  34. package/dist/templates/node-ts-template.js +26 -0
  35. package/dist/templates/node-ts-template.js.map +1 -0
  36. package/dist/templates/python-template.d.ts +2 -0
  37. package/dist/templates/python-template.d.ts.map +1 -0
  38. package/dist/templates/python-template.js +25 -0
  39. package/dist/templates/python-template.js.map +1 -0
  40. package/dist/tracing.d.ts +9 -0
  41. package/dist/tracing.d.ts.map +1 -0
  42. package/dist/tracing.js +36 -0
  43. package/dist/tracing.js.map +1 -0
  44. package/dist/util.d.ts +9 -0
  45. package/dist/util.d.ts.map +1 -0
  46. package/dist/util.js +72 -0
  47. package/dist/util.js.map +1 -0
  48. package/dist/wrapper.d.ts +11 -0
  49. package/dist/wrapper.d.ts.map +1 -0
  50. package/dist/wrapper.js +57 -0
  51. package/dist/wrapper.js.map +1 -0
  52. package/dist/yarn.lock +3703 -0
  53. package/package.json +1 -1
package/dist/env.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import Service from "serverless/classes/Service";
2
+ export interface Configuration {
3
+ addLayers: boolean;
4
+ apiKey?: string;
5
+ apiKMSKey?: string;
6
+ site: string;
7
+ logLevel: string;
8
+ flushMetricsToLogs: boolean;
9
+ enableXrayTracing: boolean;
10
+ enableDDTracing: boolean;
11
+ forwarder?: string;
12
+ enableTags: boolean;
13
+ }
14
+ export declare const defaultConfiguration: Configuration;
15
+ export declare function setEnvConfiguration(config: Configuration, service: Service): void;
16
+ export declare function getConfig(service: Service): Configuration;
17
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAQA,OAAO,OAAO,MAAM,4BAA4B,CAAC;AAEjD,MAAM,WAAW,aAAa;IAE5B,SAAS,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,MAAM,CAAC;IAEjB,kBAAkB,EAAE,OAAO,CAAC;IAE5B,iBAAiB,EAAE,OAAO,CAAC;IAE3B,eAAe,EAAE,OAAO,CAAC;IAGzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,UAAU,EAAE,OAAO,CAAC;CACrB;AASD,eAAO,MAAM,oBAAoB,EAAE,aAQlC,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,QAyB1E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAczD"}
package/dist/env.js ADDED
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /*
3
+ * Unless explicitly stated otherwise all files in this repository are licensed
4
+ * under the Apache License Version 2.0.
5
+ *
6
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
7
+ * Copyright 2019 Datadog, Inc.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const apiKeyEnvVar = "DD_API_KEY";
11
+ const apiKeyKMSEnvVar = "DD_KMS_API_KEY";
12
+ const siteURLEnvVar = "DD_SITE";
13
+ const logLevelEnvVar = "DD_LOG_LEVEL";
14
+ const logForwardingEnvVar = "DD_FLUSH_TO_LOG";
15
+ const ddTracingEnabledEnvVar = "DD_TRACE_ENABLED";
16
+ exports.defaultConfiguration = {
17
+ addLayers: true,
18
+ flushMetricsToLogs: true,
19
+ logLevel: "info",
20
+ site: "datadoghq.com",
21
+ enableXrayTracing: false,
22
+ enableDDTracing: true,
23
+ enableTags: true,
24
+ };
25
+ function setEnvConfiguration(config, service) {
26
+ const provider = service.provider;
27
+ if (provider.environment === undefined) {
28
+ provider.environment = {};
29
+ }
30
+ const environment = provider.environment;
31
+ if (config.apiKey !== undefined && environment[apiKeyEnvVar] === undefined) {
32
+ environment[apiKeyEnvVar] = config.apiKey;
33
+ }
34
+ if (config.apiKMSKey !== undefined && environment[apiKeyKMSEnvVar] === undefined) {
35
+ environment[apiKeyKMSEnvVar] = config.apiKMSKey;
36
+ }
37
+ if (environment[siteURLEnvVar] === undefined) {
38
+ environment[siteURLEnvVar] = config.site;
39
+ }
40
+ if (environment[logLevelEnvVar] === undefined) {
41
+ environment[logLevelEnvVar] = config.logLevel;
42
+ }
43
+ if (environment[logForwardingEnvVar] === undefined) {
44
+ environment[logForwardingEnvVar] = config.flushMetricsToLogs;
45
+ }
46
+ if (config.enableDDTracing !== undefined && environment[ddTracingEnabledEnvVar] === undefined) {
47
+ environment[ddTracingEnabledEnvVar] = config.enableDDTracing;
48
+ }
49
+ }
50
+ exports.setEnvConfiguration = setEnvConfiguration;
51
+ function getConfig(service) {
52
+ let custom = service.custom;
53
+ if (custom === undefined) {
54
+ custom = {};
55
+ }
56
+ let datadog = custom.datadog;
57
+ if (datadog === undefined) {
58
+ datadog = {};
59
+ }
60
+ return Object.assign(Object.assign({}, exports.defaultConfiguration), datadog);
61
+ }
62
+ exports.getConfig = getConfig;
63
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AA8BH,MAAM,YAAY,GAAG,YAAY,CAAC;AAClC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AACzC,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,MAAM,cAAc,GAAG,cAAc,CAAC;AACtC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAC9C,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAErC,QAAA,oBAAoB,GAAkB;IACjD,SAAS,EAAE,IAAI;IACf,kBAAkB,EAAE,IAAI;IACxB,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,eAAe;IACrB,iBAAiB,EAAE,KAAK;IACxB,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,SAAgB,mBAAmB,CAAC,MAAqB,EAAE,OAAgB;IACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAe,CAAC;IAEzC,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE;QACtC,QAAQ,CAAC,WAAW,GAAG,EAAE,CAAC;KAC3B;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAkB,CAAC;IAChD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,WAAW,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE;QAC1E,WAAW,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;KAC3C;IACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,WAAW,CAAC,eAAe,CAAC,KAAK,SAAS,EAAE;QAChF,WAAW,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;KACjD;IACD,IAAI,WAAW,CAAC,aAAa,CAAC,KAAK,SAAS,EAAE;QAC5C,WAAW,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;KAC1C;IACD,IAAI,WAAW,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE;QAC7C,WAAW,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;KAC/C;IACD,IAAI,WAAW,CAAC,mBAAmB,CAAC,KAAK,SAAS,EAAE;QAClD,WAAW,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC;KAC9D;IACD,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,IAAI,WAAW,CAAC,sBAAsB,CAAC,KAAK,SAAS,EAAE;QAC7F,WAAW,CAAC,sBAAsB,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC;KAC9D;AACH,CAAC;AAzBD,kDAyBC;AAED,SAAgB,SAAS,CAAC,OAAgB;IACxC,IAAI,MAAM,GAAG,OAAO,CAAC,MAAa,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,MAAM,GAAG,EAAE,CAAC;KACb;IAED,IAAI,OAAO,GAAG,MAAM,CAAC,OAA6C,CAAC;IACnE,IAAI,OAAO,KAAK,SAAS,EAAE;QACzB,OAAO,GAAG,EAAE,CAAC;KACd;IACD,uCACK,4BAAoB,GACpB,OAAO,EACV;AACJ,CAAC;AAdD,8BAcC"}
@@ -0,0 +1,14 @@
1
+ import Service from "serverless/classes/Service";
2
+ import Aws = require("serverless/plugins/aws/provider/awsProvider");
3
+ export declare function addCloudWatchForwarderSubscriptions(service: Service, aws: Aws, functionArn: string): Promise<string[]>;
4
+ export declare function canSubscribeLogGroup(aws: Aws, logGroupName: string, expectedSubName: string): Promise<boolean>;
5
+ export declare function describeSubscriptionFilters(aws: Aws, logGroupName: string): Promise<{
6
+ creationTime: number;
7
+ destinationArn: string;
8
+ distribution: string;
9
+ filterName: string;
10
+ filterPattern: string;
11
+ logGroupName: string;
12
+ roleArn: string;
13
+ }[]>;
14
+ //# sourceMappingURL=forwarder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwarder.d.ts","sourceRoot":"","sources":["../src/forwarder.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,4BAA4B,CAAC;AACjD,OAAO,GAAG,GAAG,QAAQ,6CAA6C,CAAC,CAAC;AA4BpE,wBAAsB,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,qBAuCxG;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAejG;AAED,wBAAsB,2BAA2B,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM;;;;;;;;KAc/E"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const logGroupKey = "AWS::Logs::LogGroup";
13
+ const logGroupSubscriptionKey = "AWS::Logs::SubscriptionFilter";
14
+ function isLogGroup(value) {
15
+ return value.Type === logGroupKey;
16
+ }
17
+ function addCloudWatchForwarderSubscriptions(service, aws, functionArn) {
18
+ var _a;
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ const resources = (_a = service.provider.compiledCloudFormationTemplate) === null || _a === void 0 ? void 0 : _a.Resources;
21
+ if (resources === undefined) {
22
+ return ["No cloudformation stack available. Skipping subscribing Datadog forwarder."];
23
+ }
24
+ const errors = [];
25
+ for (const [name, resource] of Object.entries(resources)) {
26
+ if (!isLogGroup(resource) || !resource.Properties.LogGroupName.startsWith("/aws/lambda/")) {
27
+ continue;
28
+ }
29
+ const logGroupName = resource.Properties.LogGroupName;
30
+ const scopedSubName = `${name}Subscription`;
31
+ let expectedSubName = `${service.getServiceName()}-${aws.getStage()}-${scopedSubName}-`;
32
+ const stackName = aws.naming.getStackName();
33
+ if (stackName) {
34
+ expectedSubName = `${stackName}-${scopedSubName}-`;
35
+ }
36
+ const canSub = yield canSubscribeLogGroup(aws, logGroupName, expectedSubName);
37
+ if (!canSub) {
38
+ errors.push(`Subscription already exists for log group ${logGroupName}. Skipping subscribing Datadog forwarder.`);
39
+ continue;
40
+ }
41
+ const subscription = {
42
+ Type: logGroupSubscriptionKey,
43
+ Properties: {
44
+ DestinationArn: functionArn,
45
+ FilterPattern: "",
46
+ LogGroupName: { Ref: name },
47
+ },
48
+ };
49
+ resources[scopedSubName] = subscription;
50
+ }
51
+ return errors;
52
+ });
53
+ }
54
+ exports.addCloudWatchForwarderSubscriptions = addCloudWatchForwarderSubscriptions;
55
+ function canSubscribeLogGroup(aws, logGroupName, expectedSubName) {
56
+ return __awaiter(this, void 0, void 0, function* () {
57
+ const subscriptionFilters = yield describeSubscriptionFilters(aws, logGroupName);
58
+ let hasUnknownSubscriptions = false;
59
+ for (const subscription of subscriptionFilters) {
60
+ const filterName = subscription.filterName;
61
+ if (filterName.startsWith(expectedSubName)) {
62
+ return true;
63
+ }
64
+ // We don't own this log group. It might not be possible to set a forwarder
65
+ hasUnknownSubscriptions = true;
66
+ }
67
+ // No log groups, so it's possible to subscribe.
68
+ return !hasUnknownSubscriptions;
69
+ });
70
+ }
71
+ exports.canSubscribeLogGroup = canSubscribeLogGroup;
72
+ function describeSubscriptionFilters(aws, logGroupName) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ try {
75
+ const result = yield aws.request("CloudWatchLogs", "describeSubscriptionFilters", {
76
+ logGroupName,
77
+ });
78
+ return result.subscriptionFilters;
79
+ }
80
+ catch (err) {
81
+ // An error will occur if the log group doesn't exist, so we swallow this and return an empty list.
82
+ return [];
83
+ }
84
+ });
85
+ }
86
+ exports.describeSubscriptionFilters = describeSubscriptionFilters;
87
+ //# sourceMappingURL=forwarder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwarder.js","sourceRoot":"","sources":["../src/forwarder.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAC1C,MAAM,uBAAuB,GAAG,+BAA+B,CAAC;AAqBhE,SAAS,UAAU,CAAC,KAAU;IAC5B,OAAO,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;AACpC,CAAC;AAED,SAAsB,mCAAmC,CAAC,OAAgB,EAAE,GAAQ,EAAE,WAAmB;;;QACvG,MAAM,SAAS,SAAG,OAAO,CAAC,QAAQ,CAAC,8BAA8B,0CAAE,SAAS,CAAC;QAC7E,IAAI,SAAS,KAAK,SAAS,EAAE;YAC3B,OAAO,CAAC,4EAA4E,CAAC,CAAC;SACvF;QACD,MAAM,MAAM,GAAG,EAAE,CAAC;QAElB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACxD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;gBACzF,SAAS;aACV;YAED,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC;YACtD,MAAM,aAAa,GAAG,GAAG,IAAI,cAAc,CAAC;YAE5C,IAAI,eAAe,GAAG,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,aAAa,GAAG,CAAC;YAExF,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC5C,IAAI,SAAS,EAAE;gBACb,eAAe,GAAG,GAAG,SAAS,IAAI,aAAa,GAAG,CAAC;aACpD;YAED,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;YAC9E,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,CAAC,IAAI,CAAC,6CAA6C,YAAY,2CAA2C,CAAC,CAAC;gBAClH,SAAS;aACV;YAED,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,UAAU,EAAE;oBACV,cAAc,EAAE,WAAW;oBAC3B,aAAa,EAAE,EAAE;oBACjB,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;iBAC5B;aACF,CAAC;YACF,SAAS,CAAC,aAAa,CAAC,GAAG,YAAY,CAAC;SACzC;QACD,OAAO,MAAM,CAAC;;CACf;AAvCD,kFAuCC;AAED,SAAsB,oBAAoB,CAAC,GAAQ,EAAE,YAAoB,EAAE,eAAuB;;QAChG,MAAM,mBAAmB,GAAG,MAAM,2BAA2B,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAEjF,IAAI,uBAAuB,GAAG,KAAK,CAAC;QAEpC,KAAK,MAAM,YAAY,IAAI,mBAAmB,EAAE;YAC9C,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;YAC3C,IAAI,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE;gBAC1C,OAAO,IAAI,CAAC;aACb;YACD,2EAA2E;YAC3E,uBAAuB,GAAG,IAAI,CAAC;SAChC;QACD,gDAAgD;QAChD,OAAO,CAAC,uBAAuB,CAAC;IAClC,CAAC;CAAA;AAfD,oDAeC;AAED,SAAsB,2BAA2B,CAAC,GAAQ,EAAE,YAAoB;;QAC9E,IAAI;YACF,MAAM,MAAM,GAAwC,MAAM,GAAG,CAAC,OAAO,CACnE,gBAAgB,EAChB,6BAA6B,EAC7B;gBACE,YAAY;aACb,CACF,CAAC;YACF,OAAO,MAAM,CAAC,mBAAmB,CAAC;SACnC;QAAC,OAAO,GAAG,EAAE;YACZ,mGAAmG;YACnG,OAAO,EAAE,CAAC;SACX;IACH,CAAC;CAAA;AAdD,kEAcC"}
@@ -0,0 +1,10 @@
1
+ import { FunctionDefinition } from "serverless";
2
+ export interface ExtendedFunctionDefinition extends FunctionDefinition {
3
+ tags?: {
4
+ [key: string]: string;
5
+ };
6
+ environment?: {
7
+ [key: string]: string;
8
+ };
9
+ }
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,IAAI,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACjC,WAAW,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACzC"}
package/dist/index.js ADDED
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /*
3
+ * Unless explicitly stated otherwise all files in this repository are licensed
4
+ * under the Apache License Version 2.0.
5
+ *
6
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
7
+ * Copyright 2019 Datadog, Inc.
8
+ */
9
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
10
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
11
+ return new (P || (P = Promise))(function (resolve, reject) {
12
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
13
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
14
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
15
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
16
+ });
17
+ };
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
22
+ result["default"] = mod;
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const layers = __importStar(require("./layers.json"));
27
+ const env_1 = require("./env");
28
+ const layer_1 = require("./layer");
29
+ const tracing_1 = require("./tracing");
30
+ const wrapper_1 = require("./wrapper");
31
+ const forwarder_1 = require("./forwarder");
32
+ var TagKeys;
33
+ (function (TagKeys) {
34
+ TagKeys["Service"] = "service";
35
+ TagKeys["Env"] = "env";
36
+ })(TagKeys || (TagKeys = {}));
37
+ module.exports = class ServerlessPlugin {
38
+ constructor(serverless, _) {
39
+ this.serverless = serverless;
40
+ this.hooks = {
41
+ "after:datadog:clean:init": this.afterPackageFunction.bind(this),
42
+ "after:datadog:generate:init": this.beforePackageFunction.bind(this),
43
+ "after:deploy:function:packageFunction": this.afterPackageFunction.bind(this),
44
+ "after:package:createDeploymentArtifacts": this.afterPackageFunction.bind(this),
45
+ "after:package:initialize": this.beforePackageFunction.bind(this),
46
+ "before:deploy:function:packageFunction": this.beforePackageFunction.bind(this),
47
+ "before:offline:start:init": this.beforePackageFunction.bind(this),
48
+ "before:step-functions-offline:start": this.beforePackageFunction.bind(this),
49
+ };
50
+ this.commands = {
51
+ datadog: {
52
+ commands: {
53
+ clean: {
54
+ lifecycleEvents: ["init"],
55
+ usage: "Cleans up wrapper handler functions for DataDog, not necessary in most cases",
56
+ },
57
+ generate: {
58
+ lifecycleEvents: ["init"],
59
+ usage: "Generates wrapper handler functions for DataDog, not necessary in most cases",
60
+ },
61
+ },
62
+ lifecycleEvents: ["clean", "generate"],
63
+ usage: "Automatically instruments your lambdas with DataDog",
64
+ },
65
+ };
66
+ }
67
+ beforePackageFunction() {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ this.serverless.cli.log("Auto instrumenting functions with Datadog");
70
+ const config = env_1.getConfig(this.serverless.service);
71
+ env_1.setEnvConfiguration(config, this.serverless.service);
72
+ const defaultRuntime = this.serverless.service.provider.runtime;
73
+ const handlers = layer_1.findHandlers(this.serverless.service, defaultRuntime);
74
+ if (config.addLayers) {
75
+ this.serverless.cli.log("Adding Lambda Layers to functions");
76
+ this.debugLogHandlers(handlers);
77
+ layer_1.applyLayers(this.serverless.service.provider.region, handlers, layers);
78
+ }
79
+ else {
80
+ this.serverless.cli.log("Skipping adding Lambda Layers, make sure you are packaging them yourself");
81
+ }
82
+ let tracingMode = tracing_1.TracingMode.NONE;
83
+ if (config.enableXrayTracing && config.enableDDTracing) {
84
+ tracingMode = tracing_1.TracingMode.HYBRID;
85
+ }
86
+ else if (config.enableDDTracing) {
87
+ tracingMode = tracing_1.TracingMode.DD_TRACE;
88
+ }
89
+ else if (config.enableXrayTracing) {
90
+ tracingMode = tracing_1.TracingMode.XRAY;
91
+ }
92
+ tracing_1.enableTracing(this.serverless.service, tracingMode);
93
+ });
94
+ }
95
+ afterPackageFunction() {
96
+ return __awaiter(this, void 0, void 0, function* () {
97
+ const config = env_1.getConfig(this.serverless.service);
98
+ if (config.forwarder) {
99
+ const aws = this.serverless.getProvider("aws");
100
+ const errors = yield forwarder_1.addCloudWatchForwarderSubscriptions(this.serverless.service, aws, config.forwarder);
101
+ for (const error of errors) {
102
+ this.serverless.cli.log(error);
103
+ }
104
+ }
105
+ if (config.enableTags) {
106
+ this.serverless.cli.log("Adding service and environment tags to functions");
107
+ this.addServiceAndEnvTags();
108
+ }
109
+ const defaultRuntime = this.serverless.service.provider.runtime;
110
+ const handlers = layer_1.findHandlers(this.serverless.service, defaultRuntime);
111
+ wrapper_1.redirectHandlers(handlers, config.addLayers);
112
+ });
113
+ }
114
+ debugLogHandlers(handlers) {
115
+ for (const handler of handlers) {
116
+ if (handler.type === layer_1.RuntimeType.UNSUPPORTED) {
117
+ if (handler.runtime === undefined) {
118
+ this.serverless.cli.log(`Unable to determine runtime for function ${handler.name}`);
119
+ }
120
+ else {
121
+ this.serverless.cli.log(`Unable to add Lambda Layers to function ${handler.name} with runtime ${handler.runtime}`);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ /**
127
+ * Check for service and env tags on provider level (under tags and stackTags),
128
+ * as well as function level. Automatically create tags for service and env with
129
+ * properties from deployment configurations if needed; does not override any existing values.
130
+ */
131
+ addServiceAndEnvTags() {
132
+ let providerServiceTagExists = false;
133
+ let providerEnvTagExists = false;
134
+ const provider = this.serverless.service.provider;
135
+ const providerTags = provider.tags;
136
+ if (providerTags !== undefined) {
137
+ providerServiceTagExists = providerTags[TagKeys.Service] !== undefined;
138
+ providerEnvTagExists = providerTags[TagKeys.Env] !== undefined;
139
+ }
140
+ const providerStackTags = provider.stackTags;
141
+ if (providerStackTags !== undefined) {
142
+ providerServiceTagExists = providerServiceTagExists || providerStackTags[TagKeys.Service] !== undefined;
143
+ providerEnvTagExists = providerEnvTagExists || providerStackTags[TagKeys.Env] !== undefined;
144
+ }
145
+ if (!providerServiceTagExists || !providerEnvTagExists) {
146
+ this.serverless.service.getAllFunctions().forEach((functionName) => {
147
+ const functionDefintion = this.serverless.service.getFunction(functionName);
148
+ if (!functionDefintion.tags) {
149
+ functionDefintion.tags = {};
150
+ }
151
+ if (!providerServiceTagExists && !functionDefintion.tags[TagKeys.Service]) {
152
+ functionDefintion.tags[TagKeys.Service] = this.serverless.service.getServiceName();
153
+ }
154
+ if (!providerEnvTagExists && !functionDefintion.tags[TagKeys.Env]) {
155
+ functionDefintion.tags[TagKeys.Env] = this.serverless.getProvider("aws").getStage();
156
+ }
157
+ });
158
+ }
159
+ }
160
+ };
161
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { FunctionDefinition } from "serverless";
2
+ import Service from "serverless/classes/Service";
3
+ export declare enum RuntimeType {
4
+ NODE = 0,
5
+ PYTHON = 1,
6
+ UNSUPPORTED = 2
7
+ }
8
+ export interface FunctionInfo {
9
+ name: string;
10
+ type: RuntimeType;
11
+ handler: FunctionDefinition;
12
+ runtime?: string;
13
+ }
14
+ export interface LayerJSON {
15
+ regions: {
16
+ [region: string]: {
17
+ [runtime: string]: string | undefined;
18
+ } | undefined;
19
+ };
20
+ }
21
+ export declare const runtimeLookup: {
22
+ [key: string]: RuntimeType;
23
+ };
24
+ export declare function findHandlers(service: Service, defaultRuntime?: string): FunctionInfo[];
25
+ export declare function applyLayers(region: string, handlers: FunctionInfo[], layers: LayerJSON): void;
26
+ //# sourceMappingURL=layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer.d.ts","sourceRoot":"","sources":["../src/layer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,OAAO,MAAM,4BAA4B,CAAC;AAEjD,oBAAY,WAAW;IACrB,IAAI,IAAA;IACJ,MAAM,IAAA;IACN,WAAW,IAAA;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE;QACP,CAAC,MAAM,EAAE,MAAM,GACX;YACE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;SACvC,GACD,SAAS,CAAC;KACf,CAAC;CACH;AAED,eAAO,MAAM,aAAa,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAA;CAQvD,CAAC;AAEF,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAetF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,SAAS,QAqBtF"}
package/dist/layer.js ADDED
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var RuntimeType;
4
+ (function (RuntimeType) {
5
+ RuntimeType[RuntimeType["NODE"] = 0] = "NODE";
6
+ RuntimeType[RuntimeType["PYTHON"] = 1] = "PYTHON";
7
+ RuntimeType[RuntimeType["UNSUPPORTED"] = 2] = "UNSUPPORTED";
8
+ })(RuntimeType = exports.RuntimeType || (exports.RuntimeType = {}));
9
+ exports.runtimeLookup = {
10
+ "nodejs10.x": RuntimeType.NODE,
11
+ "nodejs12.x": RuntimeType.NODE,
12
+ "nodejs8.10": RuntimeType.NODE,
13
+ "python2.7": RuntimeType.PYTHON,
14
+ "python3.6": RuntimeType.PYTHON,
15
+ "python3.7": RuntimeType.PYTHON,
16
+ "python3.8": RuntimeType.PYTHON,
17
+ };
18
+ function findHandlers(service, defaultRuntime) {
19
+ const funcs = service.functions;
20
+ return Object.entries(funcs)
21
+ .map(([name, handler]) => {
22
+ let { runtime } = handler;
23
+ if (runtime === undefined) {
24
+ runtime = defaultRuntime;
25
+ }
26
+ if (runtime !== undefined && runtime in exports.runtimeLookup) {
27
+ return { type: exports.runtimeLookup[runtime], runtime, name, handler };
28
+ }
29
+ return { type: RuntimeType.UNSUPPORTED, runtime, name, handler };
30
+ })
31
+ .filter((result) => result !== undefined);
32
+ }
33
+ exports.findHandlers = findHandlers;
34
+ function applyLayers(region, handlers, layers) {
35
+ const regionRuntimes = layers.regions[region];
36
+ if (regionRuntimes === undefined) {
37
+ return;
38
+ }
39
+ for (const handler of handlers) {
40
+ if (handler.type === RuntimeType.UNSUPPORTED) {
41
+ continue;
42
+ }
43
+ const { runtime } = handler;
44
+ const layerARN = runtime !== undefined ? regionRuntimes[runtime] : undefined;
45
+ if (layerARN !== undefined) {
46
+ const currentLayers = getLayers(handler);
47
+ if (!new Set(currentLayers).has(layerARN)) {
48
+ currentLayers.push(layerARN);
49
+ }
50
+ setLayers(handler, currentLayers);
51
+ }
52
+ }
53
+ }
54
+ exports.applyLayers = applyLayers;
55
+ function getLayers(handler) {
56
+ const layersList = handler.handler.layers;
57
+ if (layersList === undefined) {
58
+ return [];
59
+ }
60
+ return layersList;
61
+ }
62
+ function setLayers(handler, layers) {
63
+ handler.handler.layers = layers;
64
+ }
65
+ //# sourceMappingURL=layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer.js","sourceRoot":"","sources":["../src/layer.ts"],"names":[],"mappings":";;AAUA,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,6CAAI,CAAA;IACJ,iDAAM,CAAA;IACN,2DAAW,CAAA;AACb,CAAC,EAJW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAItB;AAmBY,QAAA,aAAa,GAAmC;IAC3D,YAAY,EAAE,WAAW,CAAC,IAAI;IAC9B,YAAY,EAAE,WAAW,CAAC,IAAI;IAC9B,YAAY,EAAE,WAAW,CAAC,IAAI;IAC9B,WAAW,EAAE,WAAW,CAAC,MAAM;IAC/B,WAAW,EAAE,WAAW,CAAC,MAAM;IAC/B,WAAW,EAAE,WAAW,CAAC,MAAM;IAC/B,WAAW,EAAE,WAAW,CAAC,MAAM;CAChC,CAAC;AAEF,SAAgB,YAAY,CAAC,OAAgB,EAAE,cAAuB;IACpE,MAAM,KAAK,GAAI,OAAe,CAAC,SAAkD,CAAC;IAElF,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;QACvB,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAC1B,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO,GAAG,cAAc,CAAC;SAC1B;QACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,qBAAa,EAAE;YACrD,OAAO,EAAE,IAAI,EAAE,qBAAa,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAkB,CAAC;SACjF;QACD,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAkB,CAAC;IACnF,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAmB,CAAC;AAChE,CAAC;AAfD,oCAeC;AAED,SAAgB,WAAW,CAAC,MAAc,EAAE,QAAwB,EAAE,MAAiB;IACrF,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,cAAc,KAAK,SAAS,EAAE;QAChC,OAAO;KACR;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,WAAW,EAAE;YAC5C,SAAS;SACV;QAED,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBACzC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B;YACD,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;SACnC;KACF;AACH,CAAC;AArBD,kCAqBC;AAED,SAAS,SAAS,CAAC,OAAqB;IACtC,MAAM,UAAU,GAAI,OAAO,CAAC,OAAe,CAAC,MAA8B,CAAC;IAC3E,IAAI,UAAU,KAAK,SAAS,EAAE;QAC5B,OAAO,EAAE,CAAC;KACX;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,SAAS,CAAC,OAAqB,EAAE,MAAgB;IACvD,OAAO,CAAC,OAAe,CAAC,MAAM,GAAG,MAAM,CAAC;AAC3C,CAAC"}