serverless-plugin-datadog 3.1.2 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. package/README.md +24 -26
  2. package/dist/env.d.ts +17 -0
  3. package/dist/env.d.ts.map +1 -0
  4. package/dist/env.js +63 -0
  5. package/dist/env.js.map +1 -0
  6. package/dist/forwarder.d.ts +14 -0
  7. package/dist/forwarder.d.ts.map +1 -0
  8. package/dist/forwarder.js +87 -0
  9. package/dist/forwarder.js.map +1 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +161 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/layer.d.ts +26 -0
  15. package/dist/layer.d.ts.map +1 -0
  16. package/dist/layer.js +65 -0
  17. package/dist/layer.js.map +1 -0
  18. package/dist/layers.json +156 -0
  19. package/dist/package.json +2 -2
  20. package/dist/src/env.d.ts +2 -1
  21. package/dist/src/env.d.ts.map +1 -1
  22. package/dist/src/env.js +10 -0
  23. package/dist/src/env.js.map +1 -1
  24. package/dist/src/index.d.ts +1 -9
  25. package/dist/src/index.d.ts.map +1 -1
  26. package/dist/src/index.js +21 -5
  27. package/dist/src/index.js.map +1 -1
  28. package/dist/src/layer.d.ts +11 -2
  29. package/dist/src/layer.d.ts.map +1 -1
  30. package/dist/src/layer.js +52 -19
  31. package/dist/src/layer.js.map +1 -1
  32. package/dist/src/layers-gov.json +20 -14
  33. package/dist/src/layers.json +210 -147
  34. package/dist/src/serverless_monitors.js +3 -3
  35. package/dist/src/serverless_monitors.js.map +1 -1
  36. package/dist/templates/node-es6-template.d.ts +2 -0
  37. package/dist/templates/node-es6-template.d.ts.map +1 -0
  38. package/dist/templates/node-es6-template.js +25 -0
  39. package/dist/templates/node-es6-template.js.map +1 -0
  40. package/dist/templates/node-js-template.d.ts +2 -0
  41. package/dist/templates/node-js-template.d.ts.map +1 -0
  42. package/dist/templates/node-js-template.js +24 -0
  43. package/dist/templates/node-js-template.js.map +1 -0
  44. package/dist/templates/node-ts-template.d.ts +2 -0
  45. package/dist/templates/node-ts-template.d.ts.map +1 -0
  46. package/dist/templates/node-ts-template.js +26 -0
  47. package/dist/templates/node-ts-template.js.map +1 -0
  48. package/dist/templates/python-template.d.ts +2 -0
  49. package/dist/templates/python-template.d.ts.map +1 -0
  50. package/dist/templates/python-template.js +25 -0
  51. package/dist/templates/python-template.js.map +1 -0
  52. package/dist/tracing.d.ts +9 -0
  53. package/dist/tracing.d.ts.map +1 -0
  54. package/dist/tracing.js +36 -0
  55. package/dist/tracing.js.map +1 -0
  56. package/dist/util.d.ts +9 -0
  57. package/dist/util.d.ts.map +1 -0
  58. package/dist/util.js +72 -0
  59. package/dist/util.js.map +1 -0
  60. package/dist/wrapper.d.ts +11 -0
  61. package/dist/wrapper.d.ts.map +1 -0
  62. package/dist/wrapper.js +57 -0
  63. package/dist/wrapper.js.map +1 -0
  64. package/dist/yarn.lock +3703 -0
  65. package/package.json +2 -2
package/README.md CHANGED
@@ -33,15 +33,16 @@ To further configure your plugin, use the following custom parameters in your `s
33
33
 
34
34
  | Parameter | Description |
35
35
  | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
36
- | `flushMetricsToLogs` | Send custom metrics by using logs with the Datadog Forwarder Lambda function (recommended). Defaults to `true`. If you disable this parameter, it's required to set `apiKey` (or `apiKMSKey` if encrypted). `flushMetricsToLogs` is ignored when `addExtension` is true. |
36
+ | `flushMetricsToLogs` | Send custom metrics by using logs with the Datadog Forwarder Lambda function (recommended). Defaults to `true`. If you disable this parameter, it's required to set `apiKey` or if encrypted, `apiKMSKey` or `apiKeySecretArn`. `flushMetricsToLogs` is ignored when `addExtension` is true. |
37
37
  | `site` | Set which Datadog site to send data, this is only used when `flushMetricsToLogs` is `false` or `addExtension` is `true`. Possible values are `datadoghq.com`, `datadoghq.eu`, `us3.datadoghq.com`, `us5.datadoghq.com`, and `ddog-gov.com`. The default is `datadoghq.com`. |
38
38
  | `apiKey` | Datadog API Key, only needed when `flushMetricsToLogs` is `false` or `addExtension` is `true`. Defining `apiKey` will add the Datadog API key directly to your Lambda functions as an environment variable. For more information about getting a Datadog API key, see the [API key documentation][3]. |
39
+ | `apiKeySecretArn` | The ARN of the secret storing the Datadog API key in AWS Secrets Manager. Use this parameter in place of `apiKey` when `flushMetricsToLogs` is `false` or `addExtension` is `true`. If set, remember to add the `secretsmanager:GetSecretValue` permission to the Lambda execution role. |
39
40
  | `apiKMSKey` | Datadog API Key encrypted using KMS. Use this parameter in place of `apiKey` when `flushMetricsToLogs` is `false` or `addExtension` is `true`, and you are using KMS encryption. Defining `apiKMSKey` will add the Datadog API Key directly to your Lambda functions as an environment variable. |
40
41
  | `captureLambdaPayload` | (Experimental) This optional setting configures Datadog ingestion for incoming and outgoing AWS Lambda payloads. Function request and response values are added as part of outgoing APM spans sent to Datadog, and require Datadog APM to be configured on your function. Obfuscation of fields in the Lambda payload is available via the `replace_tags` block within `apm_config` settings in [datadog.yaml.][12] Defaults to `false`. |
41
42
  | `monitorsApiKey` | Datadog API Key. Only needed when using plugin to create monitors for your functions and when `monitors` is defined. Separate from `apiKey` with your function, `monitorsApiKey` is only used to create monitors through the Datadog Monitors API. You may use the same API key for both `apiKey` and `monitorsApiKey`. |
42
43
  | `monitorsAppKey` | Datadog Application Key. Only needed when using plugin to create monitors for your function and when `monitors` is defined. |
43
44
  | `addLayers` | Whether to install the Datadog Lambda library as a layer. Defaults to `true`. Set to `false` when you plan to package the Datadog Lambda library to your function's deployment package on your own so that you can install a specific version of the Datadog Lambda library ([Python][4] or [Node.js][5]). |
44
- | `addExtension` | Whether to install the Datadog Lambda Extension as a layer. Defaults to `false`. When enabled, it's required to set the `apiKey` (or `apiKMSKey`) parameter. Learn more about the Lambda Extension Layer [here][8]. Note: AWS only supports Lambda Extensions for [certain runtimes][9]. |
45
+ | `addExtension` | Whether to install the Datadog Lambda Extension as a layer. Defaults to `false`. When enabled, it's required to set the `apiKey`, `apiKMSKey`, or `apiKeySecretArn` parameter. Learn more about the [Datadog Lambda Extension Layer][8] in the documentation. **Note**: AWS only supports Lambda Extensions for [certain runtimes][9]. |
45
46
  | `logLevel` | The log level, set to `DEBUG` for extended logging. |
46
47
  | `enableXrayTracing` | Set `true` to enable X-Ray tracing on the Lambda functions and API Gateway integrations. Defaults to `false`. |
47
48
  | `enableDDTracing` | Enable Datadog tracing on the Lambda function. Note: This applies only to integrations using the Datadog Extension. Defaults to `true`. |
@@ -65,6 +66,7 @@ custom:
65
66
  datadog:
66
67
  flushMetricsToLogs: true
67
68
  apiKey: "{Datadog_API_Key}"
69
+ apiKeySecretArn: "{Datadog_API_Key_Secret_ARN}"
68
70
  apiKMSKey: "{Encrypted_Datadog_API_Key}"
69
71
  monitorsApiKey: "{Datadog_API_Key}"
70
72
  monitorsAppKey: "{Datadog_Application_Key}"
@@ -195,25 +197,23 @@ custom:
195
197
 
196
198
  ```yaml
197
199
  custom:
198
- datadog:
199
- addLayers: true
200
- monitorsApiKey: "{Datadog_API_Key}"
201
- monitorsAppKey: "{Datadog_APP_Key}"
202
- monitors:
203
- - high_error_rate:
204
- name: "High Error Rate with Modified Warning Threshold"
205
- message: "More than 10% of the function’s invocations were errors in the selected time range. Notify @data.dog@datadoghq.com @slack-serverless-monitors"
206
- tags: ["modified_error_rate", "serverless", "error_rate"]
207
- require_full_window: true
208
- priority: 2
209
- options: {
210
- include_tags: true
211
- notify_audit:true
212
- thresholds: {
213
- ok: 0.025
214
- warning: 0.05
215
- }
216
- }
200
+ datadog:
201
+ addLayers: true
202
+ monitorsApiKey: "{Datadog_API_Key}"
203
+ monitorsAppKey: "{Datadog_APP_Key}"
204
+ monitors:
205
+ - high_error_rate:
206
+ name: "High Error Rate with Modified Warning Threshold"
207
+ message: "More than 10% of the function’s invocations were errors in the selected time range. Notify @data.dog@datadoghq.com @slack-serverless-monitors"
208
+ tags: ["modified_error_rate", "serverless", "error_rate"]
209
+ require_full_window: true
210
+ priority: 2
211
+ options:
212
+ include_tags: true
213
+ notify_audit: true
214
+ thresholds:
215
+ ok: 0.025
216
+ warning: 0.05
217
217
  ```
218
218
 
219
219
  ##### To delete a monitor
@@ -237,17 +237,15 @@ custom:
237
237
  message: "Custom message for custom monitor. Notify @data.dog@datadoghq.com @slack-serverless-monitors"
238
238
  tags: ["custom_monitor", "serverless"]
239
239
  priority: 3
240
- options: {
240
+ options:
241
241
  enable_logs_sample: true
242
242
  require_full_window: true
243
243
  include_tags: false
244
- notify_audit:true
244
+ notify_audit: true
245
245
  notify_no_data: false
246
- thresholds: {
246
+ thresholds:
247
247
  ok: 1
248
248
  warning: 2
249
- }
250
- }
251
249
  ```
252
250
 
253
251
  ## Opening Issues
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"}