@stacksjs/ts-cloud-core 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +321 -0
  3. package/package.json +31 -0
  4. package/src/advanced-features.test.ts +465 -0
  5. package/src/aws/cloudformation.ts +421 -0
  6. package/src/aws/cloudfront.ts +158 -0
  7. package/src/aws/credentials.test.ts +132 -0
  8. package/src/aws/credentials.ts +545 -0
  9. package/src/aws/index.ts +87 -0
  10. package/src/aws/s3.test.ts +188 -0
  11. package/src/aws/s3.ts +1088 -0
  12. package/src/aws/signature.test.ts +670 -0
  13. package/src/aws/signature.ts +1155 -0
  14. package/src/backup/disaster-recovery.test.ts +726 -0
  15. package/src/backup/disaster-recovery.ts +500 -0
  16. package/src/backup/index.ts +34 -0
  17. package/src/backup/manager.test.ts +498 -0
  18. package/src/backup/manager.ts +432 -0
  19. package/src/cicd/circleci.ts +430 -0
  20. package/src/cicd/github-actions.ts +424 -0
  21. package/src/cicd/gitlab-ci.ts +255 -0
  22. package/src/cicd/index.ts +8 -0
  23. package/src/cli/history.ts +396 -0
  24. package/src/cli/index.ts +10 -0
  25. package/src/cli/progress.ts +458 -0
  26. package/src/cli/repl.ts +454 -0
  27. package/src/cli/suggestions.ts +327 -0
  28. package/src/cli/table.test.ts +319 -0
  29. package/src/cli/table.ts +332 -0
  30. package/src/cloudformation/builder.test.ts +327 -0
  31. package/src/cloudformation/builder.ts +378 -0
  32. package/src/cloudformation/builders/api-gateway.ts +449 -0
  33. package/src/cloudformation/builders/cache.ts +334 -0
  34. package/src/cloudformation/builders/cdn.ts +278 -0
  35. package/src/cloudformation/builders/compute.ts +485 -0
  36. package/src/cloudformation/builders/database.ts +392 -0
  37. package/src/cloudformation/builders/functions.ts +343 -0
  38. package/src/cloudformation/builders/messaging.ts +140 -0
  39. package/src/cloudformation/builders/monitoring.ts +300 -0
  40. package/src/cloudformation/builders/network.ts +264 -0
  41. package/src/cloudformation/builders/queue.ts +147 -0
  42. package/src/cloudformation/builders/security.ts +399 -0
  43. package/src/cloudformation/builders/storage.ts +285 -0
  44. package/src/cloudformation/index.ts +30 -0
  45. package/src/cloudformation/types.ts +173 -0
  46. package/src/compliance/aws-config.ts +543 -0
  47. package/src/compliance/cloudtrail.ts +376 -0
  48. package/src/compliance/compliance.test.ts +423 -0
  49. package/src/compliance/guardduty.ts +446 -0
  50. package/src/compliance/index.ts +66 -0
  51. package/src/compliance/security-hub.ts +456 -0
  52. package/src/containers/build-optimization.ts +416 -0
  53. package/src/containers/containers.test.ts +508 -0
  54. package/src/containers/image-scanning.ts +360 -0
  55. package/src/containers/index.ts +9 -0
  56. package/src/containers/registry.ts +293 -0
  57. package/src/containers/service-mesh.ts +520 -0
  58. package/src/database/database.test.ts +762 -0
  59. package/src/database/index.ts +9 -0
  60. package/src/database/migrations.ts +444 -0
  61. package/src/database/performance.ts +528 -0
  62. package/src/database/replicas.ts +534 -0
  63. package/src/database/users.ts +494 -0
  64. package/src/dependency-graph.ts +143 -0
  65. package/src/deployment/ab-testing.ts +582 -0
  66. package/src/deployment/blue-green.ts +452 -0
  67. package/src/deployment/canary.ts +500 -0
  68. package/src/deployment/deployment.test.ts +526 -0
  69. package/src/deployment/index.ts +61 -0
  70. package/src/deployment/progressive.ts +62 -0
  71. package/src/dns/dns.test.ts +641 -0
  72. package/src/dns/dnssec.ts +315 -0
  73. package/src/dns/index.ts +8 -0
  74. package/src/dns/resolver.ts +496 -0
  75. package/src/dns/routing.ts +593 -0
  76. package/src/email/advanced/analytics.ts +445 -0
  77. package/src/email/advanced/index.ts +11 -0
  78. package/src/email/advanced/rules.ts +465 -0
  79. package/src/email/advanced/scheduling.ts +352 -0
  80. package/src/email/advanced/search.ts +412 -0
  81. package/src/email/advanced/shared-mailboxes.ts +404 -0
  82. package/src/email/advanced/templates.ts +455 -0
  83. package/src/email/advanced/threading.ts +281 -0
  84. package/src/email/analytics.ts +467 -0
  85. package/src/email/bounce-handling.ts +425 -0
  86. package/src/email/email.test.ts +431 -0
  87. package/src/email/handlers/__tests__/inbound.test.ts +38 -0
  88. package/src/email/handlers/__tests__/outbound.test.ts +37 -0
  89. package/src/email/handlers/converter.ts +227 -0
  90. package/src/email/handlers/feedback.ts +228 -0
  91. package/src/email/handlers/inbound.ts +169 -0
  92. package/src/email/handlers/outbound.ts +178 -0
  93. package/src/email/index.ts +15 -0
  94. package/src/email/reputation.ts +303 -0
  95. package/src/email/templates.ts +352 -0
  96. package/src/errors/index.test.ts +434 -0
  97. package/src/errors/index.ts +416 -0
  98. package/src/health-checks/index.ts +40 -0
  99. package/src/index.ts +360 -0
  100. package/src/intrinsic-functions.ts +118 -0
  101. package/src/lambda/concurrency.ts +330 -0
  102. package/src/lambda/destinations.ts +345 -0
  103. package/src/lambda/dlq.ts +425 -0
  104. package/src/lambda/index.ts +11 -0
  105. package/src/lambda/lambda.test.ts +840 -0
  106. package/src/lambda/layers.ts +263 -0
  107. package/src/lambda/versions.ts +376 -0
  108. package/src/lambda/vpc.ts +399 -0
  109. package/src/local/config.ts +114 -0
  110. package/src/local/index.ts +6 -0
  111. package/src/local/mock-aws.ts +351 -0
  112. package/src/modules/ai.ts +340 -0
  113. package/src/modules/api.ts +478 -0
  114. package/src/modules/auth.ts +805 -0
  115. package/src/modules/cache.ts +417 -0
  116. package/src/modules/cdn.ts +1062 -0
  117. package/src/modules/communication.ts +1094 -0
  118. package/src/modules/compute.ts +3348 -0
  119. package/src/modules/database.ts +554 -0
  120. package/src/modules/deployment.ts +1079 -0
  121. package/src/modules/dns.ts +337 -0
  122. package/src/modules/email.ts +1538 -0
  123. package/src/modules/filesystem.ts +515 -0
  124. package/src/modules/index.ts +32 -0
  125. package/src/modules/messaging.ts +486 -0
  126. package/src/modules/monitoring.ts +2086 -0
  127. package/src/modules/network.ts +664 -0
  128. package/src/modules/parameter-store.ts +325 -0
  129. package/src/modules/permissions.ts +1081 -0
  130. package/src/modules/phone.ts +494 -0
  131. package/src/modules/queue.ts +1260 -0
  132. package/src/modules/redirects.ts +464 -0
  133. package/src/modules/registry.ts +699 -0
  134. package/src/modules/search.ts +401 -0
  135. package/src/modules/secrets.ts +416 -0
  136. package/src/modules/security.ts +731 -0
  137. package/src/modules/sms.ts +389 -0
  138. package/src/modules/storage.ts +1120 -0
  139. package/src/modules/workflow.ts +680 -0
  140. package/src/multi-account/config.ts +521 -0
  141. package/src/multi-account/index.ts +7 -0
  142. package/src/multi-account/manager.ts +427 -0
  143. package/src/multi-region/cross-region.ts +410 -0
  144. package/src/multi-region/index.ts +8 -0
  145. package/src/multi-region/manager.ts +483 -0
  146. package/src/multi-region/regions.ts +435 -0
  147. package/src/network-security/index.ts +48 -0
  148. package/src/observability/index.ts +9 -0
  149. package/src/observability/logs.ts +522 -0
  150. package/src/observability/metrics.ts +460 -0
  151. package/src/observability/observability.test.ts +782 -0
  152. package/src/observability/synthetics.ts +568 -0
  153. package/src/observability/xray.ts +358 -0
  154. package/src/phone/advanced/analytics.ts +349 -0
  155. package/src/phone/advanced/callbacks.ts +428 -0
  156. package/src/phone/advanced/index.ts +8 -0
  157. package/src/phone/advanced/ivr-builder.ts +504 -0
  158. package/src/phone/advanced/recording.ts +310 -0
  159. package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
  160. package/src/phone/handlers/incoming-call.ts +117 -0
  161. package/src/phone/handlers/missed-call.ts +116 -0
  162. package/src/phone/handlers/voicemail.ts +179 -0
  163. package/src/phone/index.ts +9 -0
  164. package/src/presets/api-backend.ts +134 -0
  165. package/src/presets/data-pipeline.ts +204 -0
  166. package/src/presets/extend.test.ts +295 -0
  167. package/src/presets/extend.ts +297 -0
  168. package/src/presets/fullstack-app.ts +144 -0
  169. package/src/presets/index.ts +27 -0
  170. package/src/presets/jamstack.ts +135 -0
  171. package/src/presets/microservices.ts +167 -0
  172. package/src/presets/ml-api.ts +208 -0
  173. package/src/presets/nodejs-server.ts +104 -0
  174. package/src/presets/nodejs-serverless.ts +114 -0
  175. package/src/presets/realtime-app.ts +184 -0
  176. package/src/presets/static-site.ts +64 -0
  177. package/src/presets/traditional-web-app.ts +339 -0
  178. package/src/presets/wordpress.ts +138 -0
  179. package/src/preview/github.test.ts +249 -0
  180. package/src/preview/github.ts +297 -0
  181. package/src/preview/index.ts +37 -0
  182. package/src/preview/manager.test.ts +440 -0
  183. package/src/preview/manager.ts +326 -0
  184. package/src/preview/notifications.test.ts +582 -0
  185. package/src/preview/notifications.ts +341 -0
  186. package/src/queue/batch-processing.ts +402 -0
  187. package/src/queue/dlq-monitoring.ts +402 -0
  188. package/src/queue/fifo.ts +342 -0
  189. package/src/queue/index.ts +9 -0
  190. package/src/queue/management.ts +428 -0
  191. package/src/queue/queue.test.ts +429 -0
  192. package/src/resource-mgmt/index.ts +39 -0
  193. package/src/resource-naming.ts +62 -0
  194. package/src/s3/index.ts +523 -0
  195. package/src/schema/cloud-config.schema.json +554 -0
  196. package/src/schema/index.ts +68 -0
  197. package/src/security/certificate-manager.ts +492 -0
  198. package/src/security/index.ts +9 -0
  199. package/src/security/scanning.ts +545 -0
  200. package/src/security/secrets-manager.ts +476 -0
  201. package/src/security/secrets-rotation.ts +456 -0
  202. package/src/security/security.test.ts +738 -0
  203. package/src/sms/advanced/ab-testing.ts +389 -0
  204. package/src/sms/advanced/analytics.ts +336 -0
  205. package/src/sms/advanced/campaigns.ts +523 -0
  206. package/src/sms/advanced/chatbot.ts +224 -0
  207. package/src/sms/advanced/index.ts +10 -0
  208. package/src/sms/advanced/link-tracking.ts +248 -0
  209. package/src/sms/advanced/mms.ts +308 -0
  210. package/src/sms/handlers/__tests__/send.test.ts +40 -0
  211. package/src/sms/handlers/delivery-status.ts +133 -0
  212. package/src/sms/handlers/receive.ts +162 -0
  213. package/src/sms/handlers/send.ts +174 -0
  214. package/src/sms/index.ts +9 -0
  215. package/src/stack-diff.ts +389 -0
  216. package/src/static-site/index.ts +85 -0
  217. package/src/template-builder.ts +110 -0
  218. package/src/template-validator.ts +574 -0
  219. package/src/utils/cache.ts +291 -0
  220. package/src/utils/diff.ts +269 -0
  221. package/src/utils/hash.ts +227 -0
  222. package/src/utils/index.ts +8 -0
  223. package/src/utils/parallel.ts +294 -0
  224. package/src/validators/credentials.test.ts +274 -0
  225. package/src/validators/credentials.ts +233 -0
  226. package/src/validators/quotas.test.ts +434 -0
  227. package/src/validators/quotas.ts +217 -0
  228. package/test/ai.test.ts +327 -0
  229. package/test/api.test.ts +511 -0
  230. package/test/auth.test.ts +632 -0
  231. package/test/cache.test.ts +406 -0
  232. package/test/cdn.test.ts +247 -0
  233. package/test/compute.test.ts +861 -0
  234. package/test/database.test.ts +523 -0
  235. package/test/deployment.test.ts +499 -0
  236. package/test/dns.test.ts +270 -0
  237. package/test/email.test.ts +439 -0
  238. package/test/filesystem.test.ts +382 -0
  239. package/test/integration.test.ts +350 -0
  240. package/test/messaging.test.ts +514 -0
  241. package/test/monitoring.test.ts +634 -0
  242. package/test/network.test.ts +425 -0
  243. package/test/permissions.test.ts +488 -0
  244. package/test/queue.test.ts +484 -0
  245. package/test/registry.test.ts +306 -0
  246. package/test/security.test.ts +462 -0
  247. package/test/storage.test.ts +463 -0
  248. package/test/template-validator.test.ts +559 -0
  249. package/test/workflow.test.ts +592 -0
  250. package/tsconfig.json +16 -0
  251. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,522 @@
1
+ /**
2
+ * Log Aggregation
3
+ * Centralized logging across services with CloudWatch Logs
4
+ */
5
+
6
+ export interface LogGroup {
7
+ id: string
8
+ name: string
9
+ retentionDays?: number
10
+ kmsKeyId?: string
11
+ logStreams?: LogStream[]
12
+ metricFilters?: MetricFilter[]
13
+ subscriptionFilters?: SubscriptionFilter[]
14
+ }
15
+
16
+ export interface LogStream {
17
+ id: string
18
+ name: string
19
+ logGroupName: string
20
+ creationTime: Date
21
+ lastEventTime?: Date
22
+ }
23
+
24
+ export interface MetricFilter {
25
+ id: string
26
+ name: string
27
+ filterPattern: string
28
+ metricTransformations: MetricTransformation[]
29
+ }
30
+
31
+ export interface MetricTransformation {
32
+ metricName: string
33
+ metricNamespace: string
34
+ metricValue: string
35
+ defaultValue?: number
36
+ unit?: string
37
+ dimensions?: Record<string, string>
38
+ }
39
+
40
+ export interface SubscriptionFilter {
41
+ id: string
42
+ name: string
43
+ logGroupName: string
44
+ filterPattern: string
45
+ destinationArn: string
46
+ roleArn?: string
47
+ distribution?: 'Random' | 'ByLogStream'
48
+ }
49
+
50
+ export interface LogQuery {
51
+ id: string
52
+ name: string
53
+ queryString: string
54
+ logGroupNames: string[]
55
+ startTime?: Date
56
+ endTime?: Date
57
+ }
58
+
59
+ export interface LogInsightsQuery {
60
+ id: string
61
+ name: string
62
+ description?: string
63
+ query: string
64
+ logGroupNames: string[]
65
+ schedule?: string
66
+ }
67
+
68
+ /**
69
+ * Logs manager
70
+ */
71
+ export class LogsManager {
72
+ private logGroups: Map<string, LogGroup> = new Map()
73
+ private queries: Map<string, LogQuery> = new Map()
74
+ private insightsQueries: Map<string, LogInsightsQuery> = new Map()
75
+ private logGroupCounter = 0
76
+ private filterCounter = 0
77
+ private queryCounter = 0
78
+
79
+ /**
80
+ * Create log group
81
+ */
82
+ createLogGroup(group: Omit<LogGroup, 'id'>): LogGroup {
83
+ const id = `log-group-${Date.now()}-${this.logGroupCounter++}`
84
+
85
+ const logGroup: LogGroup = {
86
+ id,
87
+ ...group,
88
+ }
89
+
90
+ this.logGroups.set(id, logGroup)
91
+
92
+ return logGroup
93
+ }
94
+
95
+ /**
96
+ * Create Lambda log group
97
+ */
98
+ createLambdaLogGroup(functionName: string, retentionDays: number = 7): LogGroup {
99
+ return this.createLogGroup({
100
+ name: `/aws/lambda/${functionName}`,
101
+ retentionDays,
102
+ })
103
+ }
104
+
105
+ /**
106
+ * Create ECS log group
107
+ */
108
+ createECSLogGroup(options: {
109
+ clusterName: string
110
+ serviceName: string
111
+ retentionDays?: number
112
+ }): LogGroup {
113
+ return this.createLogGroup({
114
+ name: `/ecs/${options.clusterName}/${options.serviceName}`,
115
+ retentionDays: options.retentionDays || 14,
116
+ })
117
+ }
118
+
119
+ /**
120
+ * Create API Gateway log group
121
+ */
122
+ createAPIGatewayLogGroup(apiName: string, stage: string, retentionDays: number = 30): LogGroup {
123
+ return this.createLogGroup({
124
+ name: `/aws/apigateway/${apiName}/${stage}`,
125
+ retentionDays,
126
+ })
127
+ }
128
+
129
+ /**
130
+ * Create application log group
131
+ */
132
+ createApplicationLogGroup(options: {
133
+ appName: string
134
+ environment: string
135
+ retentionDays?: number
136
+ kmsKeyId?: string
137
+ }): LogGroup {
138
+ return this.createLogGroup({
139
+ name: `/application/${options.appName}/${options.environment}`,
140
+ retentionDays: options.retentionDays || 30,
141
+ kmsKeyId: options.kmsKeyId,
142
+ })
143
+ }
144
+
145
+ /**
146
+ * Create metric filter
147
+ */
148
+ createMetricFilter(logGroupId: string, filter: Omit<MetricFilter, 'id'>): MetricFilter {
149
+ const logGroup = this.logGroups.get(logGroupId)
150
+
151
+ if (!logGroup) {
152
+ throw new Error(`Log group not found: ${logGroupId}`)
153
+ }
154
+
155
+ const id = `filter-${Date.now()}-${this.filterCounter++}`
156
+
157
+ const metricFilter: MetricFilter = {
158
+ id,
159
+ ...filter,
160
+ }
161
+
162
+ if (!logGroup.metricFilters) {
163
+ logGroup.metricFilters = []
164
+ }
165
+
166
+ logGroup.metricFilters.push(metricFilter)
167
+
168
+ return metricFilter
169
+ }
170
+
171
+ /**
172
+ * Create error count metric filter
173
+ */
174
+ createErrorCountFilter(logGroupId: string, namespace: string): MetricFilter {
175
+ return this.createMetricFilter(logGroupId, {
176
+ name: 'ErrorCount',
177
+ filterPattern: '[timestamp, request_id, level = ERROR*, ...]',
178
+ metricTransformations: [
179
+ {
180
+ metricName: 'ErrorCount',
181
+ metricNamespace: namespace,
182
+ metricValue: '1',
183
+ defaultValue: 0,
184
+ unit: 'Count',
185
+ },
186
+ ],
187
+ })
188
+ }
189
+
190
+ /**
191
+ * Create latency metric filter
192
+ */
193
+ createLatencyFilter(logGroupId: string, namespace: string): MetricFilter {
194
+ return this.createMetricFilter(logGroupId, {
195
+ name: 'Latency',
196
+ filterPattern: '[timestamp, request_id, level, duration, ...]',
197
+ metricTransformations: [
198
+ {
199
+ metricName: 'ResponseTime',
200
+ metricNamespace: namespace,
201
+ metricValue: '$duration',
202
+ unit: 'Milliseconds',
203
+ },
204
+ ],
205
+ })
206
+ }
207
+
208
+ /**
209
+ * Create custom pattern filter
210
+ */
211
+ createCustomPatternFilter(options: {
212
+ logGroupId: string
213
+ name: string
214
+ pattern: string
215
+ metricName: string
216
+ namespace: string
217
+ }): MetricFilter {
218
+ return this.createMetricFilter(options.logGroupId, {
219
+ name: options.name,
220
+ filterPattern: options.pattern,
221
+ metricTransformations: [
222
+ {
223
+ metricName: options.metricName,
224
+ metricNamespace: options.namespace,
225
+ metricValue: '1',
226
+ defaultValue: 0,
227
+ unit: 'Count',
228
+ },
229
+ ],
230
+ })
231
+ }
232
+
233
+ /**
234
+ * Create subscription filter
235
+ */
236
+ createSubscriptionFilter(logGroupId: string, filter: Omit<SubscriptionFilter, 'id'>): SubscriptionFilter {
237
+ const logGroup = this.logGroups.get(logGroupId)
238
+
239
+ if (!logGroup) {
240
+ throw new Error(`Log group not found: ${logGroupId}`)
241
+ }
242
+
243
+ const id = `subscription-${Date.now()}-${this.filterCounter++}`
244
+
245
+ const subscriptionFilter: SubscriptionFilter = {
246
+ id,
247
+ ...filter,
248
+ }
249
+
250
+ if (!logGroup.subscriptionFilters) {
251
+ logGroup.subscriptionFilters = []
252
+ }
253
+
254
+ logGroup.subscriptionFilters.push(subscriptionFilter)
255
+
256
+ return subscriptionFilter
257
+ }
258
+
259
+ /**
260
+ * Create Kinesis subscription (for real-time log processing)
261
+ */
262
+ createKinesisSubscription(options: {
263
+ logGroupId: string
264
+ kinesisStreamArn: string
265
+ roleArn: string
266
+ filterPattern?: string
267
+ }): SubscriptionFilter {
268
+ const logGroup = this.logGroups.get(options.logGroupId)
269
+ if (!logGroup) {
270
+ throw new Error(`Log group not found: ${options.logGroupId}`)
271
+ }
272
+ return this.createSubscriptionFilter(options.logGroupId, {
273
+ name: 'KinesisSubscription',
274
+ logGroupName: logGroup.name,
275
+ filterPattern: options.filterPattern || '',
276
+ destinationArn: options.kinesisStreamArn,
277
+ roleArn: options.roleArn,
278
+ distribution: 'Random',
279
+ })
280
+ }
281
+
282
+ /**
283
+ * Create Lambda subscription (for log processing)
284
+ */
285
+ createLambdaSubscription(options: {
286
+ logGroupId: string
287
+ lambdaFunctionArn: string
288
+ filterPattern?: string
289
+ }): SubscriptionFilter {
290
+ const logGroup = this.logGroups.get(options.logGroupId)
291
+ if (!logGroup) {
292
+ throw new Error(`Log group not found: ${options.logGroupId}`)
293
+ }
294
+ return this.createSubscriptionFilter(options.logGroupId, {
295
+ name: 'LambdaSubscription',
296
+ logGroupName: logGroup.name,
297
+ filterPattern: options.filterPattern || '',
298
+ destinationArn: options.lambdaFunctionArn,
299
+ distribution: 'ByLogStream',
300
+ })
301
+ }
302
+
303
+ /**
304
+ * Create Log Insights query
305
+ */
306
+ createInsightsQuery(query: Omit<LogInsightsQuery, 'id'>): LogInsightsQuery {
307
+ const id = `query-${Date.now()}-${this.queryCounter++}`
308
+
309
+ const insightsQuery: LogInsightsQuery = {
310
+ id,
311
+ ...query,
312
+ }
313
+
314
+ this.insightsQueries.set(id, insightsQuery)
315
+
316
+ return insightsQuery
317
+ }
318
+
319
+ /**
320
+ * Create error analysis query
321
+ */
322
+ createErrorAnalysisQuery(logGroupNames: string[]): LogInsightsQuery {
323
+ return this.createInsightsQuery({
324
+ name: 'Error Analysis',
325
+ description: 'Analyze error patterns and frequencies',
326
+ query: `fields @timestamp, @message
327
+ | filter @message like /ERROR/
328
+ | stats count() by bin(5m)
329
+ | sort @timestamp desc`,
330
+ logGroupNames,
331
+ })
332
+ }
333
+
334
+ /**
335
+ * Create latency analysis query
336
+ */
337
+ createLatencyAnalysisQuery(logGroupNames: string[]): LogInsightsQuery {
338
+ return this.createInsightsQuery({
339
+ name: 'Latency Analysis',
340
+ description: 'Analyze request latency patterns',
341
+ query: `fields @timestamp, @duration
342
+ | filter @duration > 1000
343
+ | stats avg(@duration), max(@duration), min(@duration), count() by bin(5m)
344
+ | sort @timestamp desc`,
345
+ logGroupNames,
346
+ })
347
+ }
348
+
349
+ /**
350
+ * Create top errors query
351
+ */
352
+ createTopErrorsQuery(logGroupNames: string[]): LogInsightsQuery {
353
+ return this.createInsightsQuery({
354
+ name: 'Top Errors',
355
+ description: 'Find most common errors',
356
+ query: `fields @timestamp, @message
357
+ | filter @message like /ERROR/
358
+ | stats count() as error_count by @message
359
+ | sort error_count desc
360
+ | limit 20`,
361
+ logGroupNames,
362
+ })
363
+ }
364
+
365
+ /**
366
+ * Get log group
367
+ */
368
+ getLogGroup(id: string): LogGroup | undefined {
369
+ return this.logGroups.get(id)
370
+ }
371
+
372
+ /**
373
+ * List log groups
374
+ */
375
+ listLogGroups(): LogGroup[] {
376
+ return Array.from(this.logGroups.values())
377
+ }
378
+
379
+ /**
380
+ * Get insights query
381
+ */
382
+ getInsightsQuery(id: string): LogInsightsQuery | undefined {
383
+ return this.insightsQueries.get(id)
384
+ }
385
+
386
+ /**
387
+ * List insights queries
388
+ */
389
+ listInsightsQueries(): LogInsightsQuery[] {
390
+ return Array.from(this.insightsQueries.values())
391
+ }
392
+
393
+ /**
394
+ * Generate CloudFormation for log group
395
+ */
396
+ generateLogGroupCF(group: LogGroup): any {
397
+ return {
398
+ Type: 'AWS::Logs::LogGroup',
399
+ Properties: {
400
+ LogGroupName: group.name,
401
+ ...(group.retentionDays && { RetentionInDays: group.retentionDays }),
402
+ ...(group.kmsKeyId && { KmsKeyId: group.kmsKeyId }),
403
+ },
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Generate CloudFormation for metric filter
409
+ */
410
+ generateMetricFilterCF(logGroup: LogGroup, filter: MetricFilter): any {
411
+ return {
412
+ Type: 'AWS::Logs::MetricFilter',
413
+ Properties: {
414
+ FilterName: filter.name,
415
+ FilterPattern: filter.filterPattern,
416
+ LogGroupName: logGroup.name,
417
+ MetricTransformations: filter.metricTransformations.map(t => ({
418
+ MetricName: t.metricName,
419
+ MetricNamespace: t.metricNamespace,
420
+ MetricValue: t.metricValue,
421
+ ...(t.defaultValue !== undefined && { DefaultValue: t.defaultValue }),
422
+ ...(t.unit && { Unit: t.unit }),
423
+ ...(t.dimensions && { Dimensions: t.dimensions }),
424
+ })),
425
+ },
426
+ }
427
+ }
428
+
429
+ /**
430
+ * Generate CloudFormation for subscription filter
431
+ */
432
+ generateSubscriptionFilterCF(filter: SubscriptionFilter): any {
433
+ return {
434
+ Type: 'AWS::Logs::SubscriptionFilter',
435
+ Properties: {
436
+ FilterName: filter.name,
437
+ FilterPattern: filter.filterPattern,
438
+ LogGroupName: filter.logGroupName,
439
+ DestinationArn: filter.destinationArn,
440
+ ...(filter.roleArn && { RoleArn: filter.roleArn }),
441
+ ...(filter.distribution && { Distribution: filter.distribution }),
442
+ },
443
+ }
444
+ }
445
+
446
+ /**
447
+ * Generate CloudFormation for Log Insights query definition
448
+ */
449
+ generateQueryDefinitionCF(query: LogInsightsQuery): any {
450
+ return {
451
+ Type: 'AWS::Logs::QueryDefinition',
452
+ Properties: {
453
+ Name: query.name,
454
+ QueryString: query.query,
455
+ LogGroupNames: query.logGroupNames,
456
+ },
457
+ }
458
+ }
459
+
460
+ /**
461
+ * Create log aggregation with multiple filters
462
+ */
463
+ createLogAggregation(
464
+ logGroup: string,
465
+ filters: Array<{ pattern: string; metric: string }>,
466
+ retention = 7
467
+ ): {
468
+ id: string
469
+ logGroup: string
470
+ filters: Array<{ pattern: string; metric: string }>
471
+ retention: number
472
+ } {
473
+ const id = `aggregation-${Date.now()}-${this.logGroupCounter++}`
474
+
475
+ // Create log group if it doesn't exist
476
+ const group = this.createLogGroup({
477
+ name: logGroup,
478
+ retentionDays: retention,
479
+ })
480
+
481
+ // Create metric filters for each pattern
482
+ filters.forEach(filter => {
483
+ this.createMetricFilter(group.id, {
484
+ name: filter.metric,
485
+ filterPattern: filter.pattern,
486
+ metricTransformations: [
487
+ {
488
+ metricName: filter.metric,
489
+ metricNamespace: 'CustomMetrics',
490
+ metricValue: '1',
491
+ defaultValue: 0,
492
+ unit: 'Count',
493
+ },
494
+ ],
495
+ })
496
+ })
497
+
498
+ return {
499
+ id,
500
+ logGroup,
501
+ filters,
502
+ retention,
503
+ }
504
+ }
505
+
506
+ /**
507
+ * Clear all data
508
+ */
509
+ clear(): void {
510
+ this.logGroups.clear()
511
+ this.queries.clear()
512
+ this.insightsQueries.clear()
513
+ this.logGroupCounter = 0
514
+ this.filterCounter = 0
515
+ this.queryCounter = 0
516
+ }
517
+ }
518
+
519
+ /**
520
+ * Global logs manager instance
521
+ */
522
+ export const logsManager: LogsManager = new LogsManager()