@stacksjs/ts-cloud 0.7.55 → 0.7.57
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.
- package/dist/alerts/alerts.test.d.ts +1 -0
- package/dist/alerts/delivery.d.ts +45 -0
- package/dist/alerts/evaluator.d.ts +12 -0
- package/dist/alerts/health.d.ts +34 -0
- package/dist/alerts/index.d.ts +6 -0
- package/dist/alerts/model.d.ts +170 -0
- package/dist/alerts/store.d.ts +90 -0
- package/dist/alerts/telemetry.d.ts +3 -0
- package/dist/api/client.d.ts +197 -0
- package/dist/api/handler.d.ts +18 -0
- package/dist/api/handler.test.d.ts +1 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/openapi.d.ts +2 -0
- package/dist/api/service.d.ts +28 -0
- package/dist/api/types.d.ts +119 -0
- package/dist/auth/encryption.d.ts +3 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/mailer.d.ts +9 -0
- package/dist/auth/oidc.d.ts +36 -0
- package/dist/auth/oidc.test.d.ts +1 -0
- package/dist/auth/store.d.ts +121 -0
- package/dist/auth/store.test.d.ts +1 -0
- package/dist/auth/totp.d.ts +11 -0
- package/dist/auth/totp.test.d.ts +1 -0
- package/dist/auth/types.d.ts +138 -0
- package/dist/automation/index.d.ts +2 -0
- package/dist/automation/store.d.ts +46 -0
- package/dist/automation/store.test.d.ts +1 -0
- package/dist/automation/types.d.ts +66 -0
- package/dist/aws/acm.d.ts +0 -4
- package/dist/aws/application-autoscaling.d.ts +0 -5
- package/dist/aws/backup.d.ts +42 -0
- package/dist/aws/bedrock.d.ts +0 -5
- package/dist/aws/client.d.ts +3 -6
- package/dist/aws/cloudformation.d.ts +0 -4
- package/dist/aws/cloudfront-media.test.d.ts +1 -0
- package/dist/aws/cloudfront-origin.test.d.ts +1 -0
- package/dist/aws/cloudfront.d.ts +87 -3
- package/dist/aws/cloudwatch-logs.d.ts +2 -4
- package/dist/aws/cloudwatch.d.ts +1 -1
- package/dist/aws/comprehend.d.ts +0 -5
- package/dist/aws/connect.d.ts +0 -4
- package/dist/aws/cost-explorer-cache.d.ts +1 -15
- package/dist/aws/cost-explorer.d.ts +18 -9
- package/dist/aws/cost-explorer.test.d.ts +1 -0
- package/dist/aws/dynamodb.d.ts +0 -4
- package/dist/aws/ec2.d.ts +0 -4
- package/dist/aws/ecr.d.ts +0 -4
- package/dist/aws/ecs.d.ts +17 -7
- package/dist/aws/efs.d.ts +0 -4
- package/dist/aws/elasticache.d.ts +0 -4
- package/dist/aws/elbv2.d.ts +0 -7
- package/dist/aws/email.d.ts +0 -10
- package/dist/aws/eventbridge.d.ts +0 -4
- package/dist/aws/iam.d.ts +1 -5
- package/dist/aws/imap-server.d.ts +0 -7
- package/dist/aws/index.d.ts +4 -3
- package/dist/aws/index.js +31 -31
- package/dist/aws/kendra.d.ts +0 -5
- package/dist/aws/lambda.d.ts +3 -5
- package/dist/aws/opensearch.d.ts +0 -4
- package/dist/aws/personalize.d.ts +0 -5
- package/dist/aws/polly.d.ts +0 -5
- package/dist/aws/rds.d.ts +59 -4
- package/dist/aws/rekognition.d.ts +0 -5
- package/dist/aws/route53-domains.d.ts +0 -4
- package/dist/aws/route53.d.ts +0 -4
- package/dist/aws/s3.d.ts +10 -6
- package/dist/aws/scheduler.d.ts +0 -4
- package/dist/aws/secrets-manager.d.ts +0 -4
- package/dist/aws/setup-sms.d.ts +0 -14
- package/dist/aws/sms.d.ts +0 -10
- package/dist/aws/smtp-server.d.ts +0 -11
- package/dist/aws/sns.d.ts +0 -4
- package/dist/aws/sqs.d.ts +0 -4
- package/dist/aws/ssm.d.ts +0 -4
- package/dist/aws/sts.d.ts +0 -4
- package/dist/aws/support.d.ts +0 -4
- package/dist/aws/textract.d.ts +0 -5
- package/dist/aws/transcribe.d.ts +0 -4
- package/dist/aws/translate.d.ts +0 -5
- package/dist/aws/voice.d.ts +0 -11
- package/dist/aws/xray.d.ts +1 -0
- package/dist/backups/aws-database-source.d.ts +19 -0
- package/dist/backups/aws-database-source.test.d.ts +1 -0
- package/dist/backups/aws-infrastructure-source.d.ts +43 -0
- package/dist/backups/aws-infrastructure-source.test.d.ts +1 -0
- package/dist/backups/control-plane-source.d.ts +16 -0
- package/dist/backups/control-plane-source.test.d.ts +1 -0
- package/dist/backups/docker-volume-source.d.ts +31 -0
- package/dist/backups/docker-volume-source.test.d.ts +1 -0
- package/dist/backups/filesystem-source.d.ts +34 -0
- package/dist/backups/filesystem-source.test.d.ts +1 -0
- package/dist/backups/index.d.ts +10 -0
- package/dist/backups/logical-database-source.d.ts +16 -0
- package/dist/backups/logical-database-source.test.d.ts +1 -0
- package/dist/backups/model.d.ts +121 -0
- package/dist/backups/s3-destination.d.ts +85 -0
- package/dist/backups/s3-destination.test.d.ts +1 -0
- package/dist/backups/service.d.ts +80 -0
- package/dist/backups/service.test.d.ts +1 -0
- package/dist/backups/store.d.ts +30 -0
- package/dist/backups/store.test.d.ts +1 -0
- package/dist/bin/cli.js +3360 -1802
- package/dist/{chunk-tjjgajbh.js → chunk-01d86gt1.js} +301 -9
- package/dist/{chunk-73vcqg6z.js → chunk-0z43x8re.js} +7 -7
- package/dist/{chunk-tnztxpcb.js → chunk-32e7ya18.js} +61 -49
- package/dist/{chunk-qpj3edwz.js → chunk-4cjrg98a.js} +3 -7
- package/dist/{chunk-hsk6fe6x.js → chunk-50jpda9q.js} +2 -2
- package/dist/{chunk-93hjhs78.js → chunk-703nkybg.js} +1 -1
- package/dist/{chunk-d5vqwj8s.js → chunk-9m6b4m74.js} +755 -720
- package/dist/chunk-e05phx5f.js +10 -0
- package/dist/{chunk-f29w04w5.js → chunk-exbcsab2.js} +10 -4
- package/dist/{chunk-eq08r166.js → chunk-f55nkpvb.js} +2 -2
- package/dist/{chunk-3bfv1z4v.js → chunk-fv1bj3yt.js} +63 -56
- package/dist/chunk-fw3q88wk.js +48641 -0
- package/dist/{chunk-3knnr7wh.js → chunk-he9a874b.js} +170 -2
- package/dist/{chunk-zn0nxxa8.js → chunk-hpv68b4a.js} +1070 -1070
- package/dist/chunk-k114qwg9.js +12 -0
- package/dist/{chunk-r16e02bc.js → chunk-vdk53yyq.js} +3900 -4101
- package/dist/{chunk-jp2a8yad.js → chunk-vvkd46k1.js} +15 -13
- package/dist/{chunk-vd87cpvn.js → chunk-wj3s95p9.js} +62 -46
- package/dist/{chunk-mj1tmhte.js → chunk-x9s0cqfx.js} +1 -1
- package/dist/{chunk-3rsfns7x.js → chunk-ybcz6sxc.js} +2048 -387
- package/dist/{chunk-arsh1g5h.js → chunk-zqtpg06c.js} +14 -11
- package/dist/compose/index.d.ts +6 -0
- package/dist/compose/parser.d.ts +13 -0
- package/dist/compose/parser.test.d.ts +1 -0
- package/dist/compose/runtime.d.ts +10 -0
- package/dist/compose/service.d.ts +18 -0
- package/dist/compose/store.d.ts +59 -0
- package/dist/compose/store.test.d.ts +1 -0
- package/dist/compose/templates.d.ts +17 -0
- package/dist/compose/types.d.ts +164 -0
- package/dist/configuration/backends.d.ts +66 -0
- package/dist/configuration/backends.test.d.ts +1 -0
- package/dist/configuration/dotenv.d.ts +14 -0
- package/dist/configuration/dotenv.test.d.ts +1 -0
- package/dist/configuration/index.d.ts +6 -0
- package/dist/configuration/migrate.d.ts +10 -0
- package/dist/configuration/migrate.test.d.ts +1 -0
- package/dist/configuration/model.d.ts +50 -0
- package/dist/configuration/service.d.ts +144 -0
- package/dist/configuration/service.test.d.ts +1 -0
- package/dist/configuration/store.d.ts +33 -0
- package/dist/configuration/store.test.d.ts +1 -0
- package/dist/control-plane/authorization.d.ts +24 -0
- package/dist/control-plane/authorization.test.d.ts +1 -0
- package/dist/control-plane/index.d.ts +8 -0
- package/dist/control-plane/migrations.d.ts +7 -0
- package/dist/control-plane/search.d.ts +25 -0
- package/dist/control-plane/store.d.ts +117 -0
- package/dist/control-plane/store.test.d.ts +1 -0
- package/dist/control-plane/types.d.ts +381 -0
- package/dist/cost/reporting.d.ts +24 -0
- package/dist/cost/reporting.test.d.ts +1 -0
- package/dist/cost/resource-inventory.d.ts +32 -0
- package/dist/cost/resource-inventory.test.d.ts +1 -0
- package/dist/cost/resource-optimization.d.ts +59 -0
- package/dist/cost/resource-optimization.test.d.ts +1 -0
- package/dist/data-services/adapters.d.ts +39 -0
- package/dist/data-services/aws-transports.d.ts +29 -0
- package/dist/data-services/aws-transports.test.d.ts +1 -0
- package/dist/data-services/capabilities.d.ts +2 -0
- package/dist/data-services/data-services.test.d.ts +1 -0
- package/dist/data-services/docker-transport.d.ts +55 -0
- package/dist/data-services/docker-transport.test.d.ts +1 -0
- package/dist/data-services/index.d.ts +8 -0
- package/dist/data-services/model.d.ts +79 -0
- package/dist/data-services/secrets.d.ts +13 -0
- package/dist/data-services/secrets.test.d.ts +1 -0
- package/dist/data-services/service.d.ts +51 -0
- package/dist/data-services/store.d.ts +17 -0
- package/dist/deploy/container-image.d.ts +28 -0
- package/dist/deploy/container-image.test.d.ts +1 -0
- package/dist/deploy/dashboard-audit.test.d.ts +1 -0
- package/dist/deploy/dashboard-auth.d.ts +4 -23
- package/dist/deploy/dashboard-backups.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-configuration.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-control-plane.d.ts +37 -0
- package/dist/deploy/dashboard-control-plane.test.d.ts +1 -0
- package/dist/deploy/dashboard-data-services.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-environment-scope.test.d.ts +1 -0
- package/dist/deploy/dashboard-guard.d.ts +12 -0
- package/dist/deploy/dashboard-guard.test.d.ts +1 -0
- package/dist/deploy/dashboard-identities.d.ts +15 -0
- package/dist/deploy/dashboard-identities.test.d.ts +1 -0
- package/dist/deploy/dashboard-jobs.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-login-page.d.ts +5 -5
- package/dist/deploy/dashboard-login-page.test.d.ts +1 -0
- package/dist/deploy/dashboard-oidc.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-onboarding.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-policy.d.ts +4 -2
- package/dist/deploy/dashboard-queue-worker.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-release.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-route-manifest.d.ts +14 -0
- package/dist/deploy/dashboard-route-manifest.test.d.ts +1 -0
- package/dist/deploy/dashboard-security.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-session.d.ts +3 -14
- package/dist/deploy/dashboard-source.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-users.d.ts +3 -0
- package/dist/deploy/fullstack-container.d.ts +87 -0
- package/dist/deploy/fullstack-container.test.d.ts +1 -0
- package/dist/deploy/index.d.ts +7 -2
- package/dist/deploy/index.js +65 -25
- package/dist/deploy/local-dashboard-server.d.ts +30 -0
- package/dist/deploy/quick-deploy.d.ts +1 -1
- package/dist/deploy/serverless-operations.d.ts +1 -0
- package/dist/deploy/site-target.d.ts +16 -0
- package/dist/deploy/static-api-origin.d.ts +107 -0
- package/dist/deploy/static-api-origin.test.d.ts +1 -0
- package/dist/deploy/static-site-helper.d.ts +0 -16
- package/dist/deploy/telemetry-access.d.ts +5 -0
- package/dist/deploy/telemetry-access.test.d.ts +1 -0
- package/dist/deploy/telemetry-collection.d.ts +44 -0
- package/dist/deploy/telemetry-collection.test.d.ts +1 -0
- package/dist/dns/index.js +3 -3
- package/dist/dns/route53-adapter.d.ts +1 -1
- package/dist/drivers/hetzner/cloud-init.d.ts +1 -1
- package/dist/drivers/index.d.ts +2 -2
- package/dist/drivers/index.js +6 -6
- package/dist/drivers/shared/notifications.d.ts +1 -1
- package/dist/drivers/shared/rpx-gateway.d.ts +1 -0
- package/dist/fleet/fleet.test.d.ts +1 -0
- package/dist/fleet/index.d.ts +144 -0
- package/dist/fleet/queue.d.ts +3 -0
- package/dist/fleet/ssh-driver.d.ts +34 -0
- package/dist/index.d.ts +28 -4
- package/dist/index.js +1132 -424
- package/dist/jobs/adapters.d.ts +23 -0
- package/dist/jobs/index.d.ts +7 -0
- package/dist/jobs/jobs.test.d.ts +1 -0
- package/dist/jobs/model.d.ts +100 -0
- package/dist/jobs/provider-adapters.d.ts +49 -0
- package/dist/jobs/reconcile.d.ts +19 -0
- package/dist/jobs/schedule.d.ts +9 -0
- package/dist/jobs/service.d.ts +30 -0
- package/dist/jobs/store.d.ts +48 -0
- package/dist/maintenance/drivers.d.ts +117 -0
- package/dist/maintenance/index.d.ts +6 -0
- package/dist/maintenance/maintenance.test.d.ts +1 -0
- package/dist/maintenance/manifest.d.ts +15 -0
- package/dist/maintenance/queue.d.ts +9 -0
- package/dist/maintenance/service.d.ts +31 -0
- package/dist/maintenance/store.d.ts +84 -0
- package/dist/maintenance/types.d.ts +192 -0
- package/dist/media.d.ts +62 -0
- package/dist/media.test.d.ts +1 -0
- package/dist/object-storage/index.d.ts +0 -24
- package/dist/onboarding/archive.d.ts +12 -0
- package/dist/onboarding/artifact-store.d.ts +22 -0
- package/dist/onboarding/detection.d.ts +8 -0
- package/dist/onboarding/index.d.ts +9 -0
- package/dist/onboarding/migrations.d.ts +3 -0
- package/dist/onboarding/onboarding.test.d.ts +1 -0
- package/dist/onboarding/plan.d.ts +3 -0
- package/dist/onboarding/registry.d.ts +41 -0
- package/dist/onboarding/service.d.ts +16 -0
- package/dist/onboarding/store.d.ts +30 -0
- package/dist/onboarding/types.d.ts +204 -0
- package/dist/placement/builds.d.ts +20 -0
- package/dist/placement/drivers.d.ts +54 -0
- package/dist/placement/index.d.ts +6 -0
- package/dist/placement/placement.test.d.ts +1 -0
- package/dist/placement/queue.d.ts +4 -0
- package/dist/placement/service.d.ts +34 -0
- package/dist/placement/store.d.ts +49 -0
- package/dist/placement/types.d.ts +109 -0
- package/dist/preview/index.d.ts +3 -0
- package/dist/preview/service.d.ts +45 -0
- package/dist/preview/service.test.d.ts +1 -0
- package/dist/preview/store.d.ts +47 -0
- package/dist/preview/store.test.d.ts +1 -0
- package/dist/preview/types.d.ts +99 -0
- package/dist/push/apns.d.ts +0 -26
- package/dist/push/fcm.d.ts +0 -23
- package/dist/push/index.d.ts +2 -2
- package/dist/push/index.js +1 -1
- package/dist/queue/deployment-handlers.d.ts +27 -0
- package/dist/queue/deployment-handlers.test.d.ts +1 -0
- package/dist/queue/index.d.ts +4 -0
- package/dist/queue/queue.d.ts +57 -0
- package/dist/queue/queue.test.d.ts +1 -0
- package/dist/queue/types.d.ts +93 -0
- package/dist/queue/worker.d.ts +32 -0
- package/dist/queue/worker.test.d.ts +1 -0
- package/dist/regions/drivers.d.ts +139 -0
- package/dist/regions/index.d.ts +5 -0
- package/dist/regions/queue.d.ts +4 -0
- package/dist/regions/regions.test.d.ts +1 -0
- package/dist/regions/service.d.ts +23 -0
- package/dist/regions/store.d.ts +41 -0
- package/dist/regions/types.d.ts +132 -0
- package/dist/release/index.d.ts +6 -0
- package/dist/release/queue.d.ts +15 -0
- package/dist/release/queue.test.d.ts +1 -0
- package/dist/release/runtime.d.ts +35 -0
- package/dist/release/runtime.test.d.ts +1 -0
- package/dist/release/service.d.ts +28 -0
- package/dist/release/store.d.ts +88 -0
- package/dist/release/store.test.d.ts +1 -0
- package/dist/release/strategy.d.ts +8 -0
- package/dist/release/types.d.ts +103 -0
- package/dist/runtime/adapters/aws.d.ts +5 -0
- package/dist/runtime/adapters/docker.d.ts +53 -0
- package/dist/runtime/adapters/systemd.d.ts +26 -0
- package/dist/runtime/index.d.ts +9 -0
- package/dist/runtime/inventory.d.ts +6 -0
- package/dist/runtime/model.d.ts +130 -0
- package/dist/runtime/normalize.d.ts +5 -0
- package/dist/runtime/operations.d.ts +113 -0
- package/dist/runtime/service.d.ts +32 -0
- package/dist/runtime/streams.d.ts +49 -0
- package/dist/security/artifacts.d.ts +105 -0
- package/dist/security/artifacts.test.d.ts +1 -0
- package/dist/security/container-release.d.ts +35 -0
- package/dist/security/container-release.test.d.ts +1 -0
- package/dist/security/index.d.ts +8 -0
- package/dist/security/integration.d.ts +41 -0
- package/dist/security/integration.test.d.ts +1 -0
- package/dist/security/posture-store.d.ts +80 -0
- package/dist/security/posture-store.test.d.ts +1 -0
- package/dist/security/pre-deploy-scanner.d.ts +0 -4
- package/dist/security/scanners.d.ts +81 -0
- package/dist/security/scanners.test.d.ts +1 -0
- package/dist/security/types.d.ts +150 -0
- package/dist/source/git-workspace.d.ts +26 -0
- package/dist/source/git-workspace.test.d.ts +1 -0
- package/dist/source/index.d.ts +6 -0
- package/dist/source/providers.d.ts +199 -0
- package/dist/source/providers.test.d.ts +1 -0
- package/dist/source/service.d.ts +18 -0
- package/dist/source/store.d.ts +149 -0
- package/dist/source/store.test.d.ts +1 -0
- package/dist/source/types.d.ts +191 -0
- package/dist/source/webhooks.d.ts +33 -0
- package/dist/source/webhooks.test.d.ts +1 -0
- package/dist/ssl/acme-client.d.ts +0 -6
- package/dist/storage/compose.d.ts +4 -0
- package/dist/storage/compose.test.d.ts +1 -0
- package/dist/storage/drivers.d.ts +107 -0
- package/dist/storage/drivers.test.d.ts +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/model.d.ts +112 -0
- package/dist/storage/service.d.ts +95 -0
- package/dist/storage/storage.test.d.ts +1 -0
- package/dist/storage/store.d.ts +40 -0
- package/dist/telemetry/correlation.test.d.ts +1 -0
- package/dist/telemetry/index.d.ts +4 -0
- package/dist/telemetry/model.d.ts +145 -0
- package/dist/telemetry/policy.d.ts +8 -0
- package/dist/telemetry/policy.test.d.ts +1 -0
- package/dist/telemetry/redaction.d.ts +9 -0
- package/dist/telemetry/store.d.ts +34 -0
- package/dist/telemetry/store.test.d.ts +1 -0
- package/dist/ui/404.html +1506 -17
- package/dist/ui/accept-invitation.html +1163 -0
- package/dist/ui/{server/backups.html → access-denied.html} +344 -55
- package/dist/ui/account/automation.html +1669 -0
- package/dist/ui/account/security.html +1646 -0
- package/dist/ui/applications/compose.html +1590 -0
- package/dist/ui/applications/new.html +1868 -0
- package/dist/ui/data/backups.html +1757 -0
- package/dist/ui/data/services.html +1723 -0
- package/dist/ui/data/volumes.html +1639 -0
- package/dist/ui/index.html +392 -29
- package/dist/ui/integrations.html +1865 -0
- package/dist/ui/operations/alerts.html +1610 -0
- package/dist/ui/operations/configuration.html +1746 -0
- package/dist/ui/operations/jobs.html +1709 -0
- package/dist/ui/operations/maintenance.html +1540 -0
- package/dist/ui/operations/observability.html +1742 -0
- package/dist/ui/{serverless/scheduler.html → operations/previews.html} +447 -46
- package/dist/ui/operations/queue.html +1615 -0
- package/dist/ui/{server/workers.html → operations/regions.html} +413 -49
- package/dist/ui/operations/releases.html +1596 -0
- package/dist/ui/operations/workloads.html +1775 -0
- package/dist/ui/security.html +1767 -0
- package/dist/ui/server/actions.html +446 -57
- package/dist/ui/server/activity.html +346 -1
- package/dist/ui/server/capacity.html +1542 -0
- package/dist/ui/server/database.html +443 -36
- package/dist/ui/server/deployments.html +439 -53
- package/dist/ui/server/diagnostics.html +346 -1
- package/dist/ui/server/firewall.html +476 -50
- package/dist/ui/server/fleet.html +1577 -0
- package/dist/ui/server/logs.html +389 -25
- package/dist/ui/server/metrics.html +346 -1
- package/dist/ui/server/security.html +346 -1
- package/dist/ui/server/services.html +421 -46
- package/dist/ui/server/sites.html +476 -95
- package/dist/ui/server/ssh-keys.html +476 -46
- package/dist/ui/server/team.html +700 -77
- package/dist/ui/server/terminal.html +444 -54
- package/dist/ui/serverless/alarms.html +430 -42
- package/dist/ui/serverless/assets.html +421 -46
- package/dist/ui/serverless/cost.html +346 -1
- package/dist/ui/serverless/data.html +422 -47
- package/dist/ui/serverless/deployments.html +421 -46
- package/dist/ui/serverless/firewall.html +346 -1
- package/dist/ui/serverless/functions.html +423 -48
- package/dist/ui/serverless/logs.html +389 -25
- package/dist/ui/serverless/metrics.html +346 -1
- package/dist/ui/serverless/queues.html +448 -62
- package/dist/ui/serverless/secrets.html +448 -42
- package/dist/ui/serverless/traces.html +350 -5
- package/dist/ui/serverless.html +434 -58
- package/dist/ui-src/pages/404.stx +18 -0
- package/dist/ui-src/pages/accept-invitation.stx +50 -0
- package/dist/ui-src/pages/access-denied.stx +18 -0
- package/dist/ui-src/pages/account/automation.stx +187 -0
- package/dist/ui-src/pages/account/security.stx +249 -0
- package/dist/ui-src/pages/applications/compose.stx +38 -0
- package/dist/ui-src/pages/applications/new.stx +76 -0
- package/dist/ui-src/pages/data/backups.stx +214 -0
- package/dist/ui-src/pages/data/services.stx +257 -0
- package/dist/ui-src/pages/data/volumes.stx +40 -0
- package/dist/ui-src/pages/index.stx +24 -10
- package/dist/ui-src/pages/integrations.stx +186 -0
- package/dist/ui-src/pages/operations/alerts.stx +40 -0
- package/dist/ui-src/pages/operations/configuration.stx +164 -0
- package/dist/ui-src/pages/operations/jobs.stx +238 -0
- package/dist/ui-src/pages/operations/maintenance.stx +15 -0
- package/dist/ui-src/pages/operations/observability.stx +76 -0
- package/dist/ui-src/pages/operations/previews.stx +62 -0
- package/dist/ui-src/pages/operations/queue.stx +158 -0
- package/dist/ui-src/pages/operations/regions.stx +12 -0
- package/dist/ui-src/pages/operations/releases.stx +39 -0
- package/dist/ui-src/pages/operations/workloads.stx +151 -0
- package/dist/ui-src/pages/partials/head.stx +148 -15
- package/dist/ui-src/pages/partials/nav.stx +491 -74
- package/dist/ui-src/pages/partials/op-confirm.stx +6 -6
- package/dist/ui-src/pages/security.stx +264 -0
- package/dist/ui-src/pages/server/actions.stx +17 -26
- package/dist/ui-src/pages/server/capacity.stx +16 -0
- package/dist/ui-src/pages/server/database.stx +31 -16
- package/dist/ui-src/pages/server/deployments.stx +28 -30
- package/dist/ui-src/pages/server/firewall.stx +25 -30
- package/dist/ui-src/pages/server/fleet.stx +10 -0
- package/dist/ui-src/pages/server/logs.stx +11 -9
- package/dist/ui-src/pages/server/metrics.stx +8 -16
- package/dist/ui-src/pages/server/services.stx +19 -28
- package/dist/ui-src/pages/server/sites.stx +75 -72
- package/dist/ui-src/pages/server/ssh-keys.stx +24 -30
- package/dist/ui-src/pages/server/team.stx +286 -149
- package/dist/ui-src/pages/server/terminal.stx +6 -28
- package/dist/ui-src/pages/serverless/alarms.stx +17 -31
- package/dist/ui-src/pages/serverless/assets.stx +13 -22
- package/dist/ui-src/pages/serverless/cost.stx +15 -3
- package/dist/ui-src/pages/serverless/data.stx +12 -25
- package/dist/ui-src/pages/serverless/deployments.stx +14 -23
- package/dist/ui-src/pages/serverless/firewall.stx +5 -1
- package/dist/ui-src/pages/serverless/functions.stx +20 -26
- package/dist/ui-src/pages/serverless/logs.stx +11 -10
- package/dist/ui-src/pages/serverless/metrics.stx +18 -17
- package/dist/ui-src/pages/serverless/queues.stx +34 -42
- package/dist/ui-src/pages/serverless/secrets.stx +31 -34
- package/dist/ui-src/pages/serverless/traces.stx +2 -6
- package/dist/ui-src/pages/serverless.stx +40 -74
- package/package.json +11 -11
- package/dist/chunk-b17vf1g1.js +0 -13787
- package/dist/chunk-b82pbxyp.js +0 -1572
- package/dist/chunk-pqfzdg68.js +0 -12
- package/dist/chunk-z58fqnjm.js +0 -10
- package/dist/ui-src/pages/server/backups.stx +0 -91
- package/dist/ui-src/pages/server/workers.stx +0 -99
- package/dist/ui-src/pages/serverless/scheduler.stx +0 -89
|
@@ -19,6 +19,8 @@ const initialPresets = presetsList
|
|
|
19
19
|
function tone(s) { return s === 'ALARM' ? 'bad' : (s === 'OK' ? 'ok' : 'warn') }
|
|
20
20
|
</script>
|
|
21
21
|
<script client>
|
|
22
|
+
import { useOpConfirm } from '../../functions/useOpConfirm.ts'
|
|
23
|
+
|
|
22
24
|
// Alarms manager: list/create/delete CloudWatch alarms via /api/serverless/alarms.
|
|
23
25
|
const rows = state(initialAlarms)
|
|
24
26
|
const presets = state(initialPresets)
|
|
@@ -26,12 +28,14 @@ const preset = state(initialPresets[0] ? initialPresets[0].key : '')
|
|
|
26
28
|
const threshold = state('')
|
|
27
29
|
const msg = state('')
|
|
28
30
|
const msgOk = state(false)
|
|
29
|
-
const busy = state(false)
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
|
|
32
|
+
const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
|
|
33
|
+
const res = await fetch('/api/serverless/alarms', { method: 'DELETE', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ name: p.name, confirm: p.apiConfirm }) })
|
|
34
|
+
const body = await res.json()
|
|
35
|
+
msg.set(body.ok ? (body.stdout || 'Deleted.') : (body.error || 'Failed to delete.')); msgOk.set(!!body.ok)
|
|
36
|
+
if (body.ok) refresh()
|
|
37
|
+
return msg()
|
|
38
|
+
})
|
|
35
39
|
|
|
36
40
|
function toneOf(s) { return s === 'ALARM' ? 'bad' : (s === 'OK' ? 'ok' : 'warn') }
|
|
37
41
|
|
|
@@ -60,20 +64,7 @@ async function createAlarm() {
|
|
|
60
64
|
finally { busy.set(false) }
|
|
61
65
|
}
|
|
62
66
|
|
|
63
|
-
function askDelete(name) {
|
|
64
|
-
function cancelDelete() { pendingDelete.set(null); typedDelete.set('') }
|
|
65
|
-
async function confirmDelete() {
|
|
66
|
-
const name = pendingDelete()
|
|
67
|
-
if (!name || typedDelete() !== name) return
|
|
68
|
-
pendingDelete.set(null); typedDelete.set('')
|
|
69
|
-
msg.set('Deleting ' + name + '...'); msgOk.set(false)
|
|
70
|
-
try {
|
|
71
|
-
const res = await fetch('/api/serverless/alarms', { method: 'DELETE', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ name, confirm: name }) })
|
|
72
|
-
const body = await res.json()
|
|
73
|
-
msg.set(body.ok ? (body.stdout || 'Deleted.') : (body.error || 'Failed to delete.')); msgOk.set(!!body.ok)
|
|
74
|
-
if (body.ok) refresh()
|
|
75
|
-
} catch (e) { msg.set('Failed: ' + ((e && e.message) || e)); msgOk.set(false) }
|
|
76
|
-
}
|
|
67
|
+
function askDelete(name) { askOp('alarm:delete:' + name, name, 'delete alarm ' + name, null, name, { name, danger: true, label: 'Delete alarm' }) }
|
|
77
68
|
</script>
|
|
78
69
|
<!DOCTYPE html>
|
|
79
70
|
<html lang="en" data-theme="dark">
|
|
@@ -94,7 +85,7 @@ async function confirmDelete() {
|
|
|
94
85
|
<div class="section">
|
|
95
86
|
<div class="panel">
|
|
96
87
|
<table>
|
|
97
|
-
<thead><tr><th>Alarm</th><th>Metric</th><th>Condition</th><th>State</th><th class="table-actions">Actions</th></tr></thead>
|
|
88
|
+
<thead><tr><th scope="col">Alarm</th><th scope="col">Metric</th><th scope="col">Condition</th><th scope="col">State</th><th scope="col" class="table-actions">Actions</th></tr></thead>
|
|
98
89
|
<tbody>
|
|
99
90
|
<template :for="a in rows()">
|
|
100
91
|
<tr>
|
|
@@ -104,7 +95,7 @@ async function confirmDelete() {
|
|
|
104
95
|
<td><span class="pill {{ toneOf(a.StateValue) }}">{{ a.StateValue }}</span></td>
|
|
105
96
|
<td class="table-actions">
|
|
106
97
|
<div class="row-actions" style="justify-content:flex-end">
|
|
107
|
-
<button class="btn danger sm" type="button" @click="askDelete(a.AlarmName)">Delete</button>
|
|
98
|
+
<button class="btn danger sm" type="button" :aria-label="'Delete alarm ' + a.AlarmName" @click="askDelete(a.AlarmName)">Delete</button>
|
|
108
99
|
</div>
|
|
109
100
|
</td>
|
|
110
101
|
</tr>
|
|
@@ -115,12 +106,7 @@ async function confirmDelete() {
|
|
|
115
106
|
</tbody>
|
|
116
107
|
</table>
|
|
117
108
|
|
|
118
|
-
|
|
119
|
-
<span>Type <b class="mono">{{ pendingDelete() }}</b> to delete this alarm:</span>
|
|
120
|
-
<input class="op-confirm-input" :value="typedDelete()" @input="typedDelete.set($event.target.value)" @keydown.enter="confirmDelete()" placeholder="confirm" autocomplete="off">
|
|
121
|
-
<button class="btn danger sm" :disabled="!canDelete()" @click="confirmDelete()">Delete</button>
|
|
122
|
-
<button class="btn ghost sm" @click="cancelDelete()">Cancel</button>
|
|
123
|
-
</div>
|
|
109
|
+
@include('../partials/op-confirm')
|
|
124
110
|
</div>
|
|
125
111
|
</div>
|
|
126
112
|
|
|
@@ -129,16 +115,16 @@ async function confirmDelete() {
|
|
|
129
115
|
<div class="panel">
|
|
130
116
|
<div class="form-grid">
|
|
131
117
|
<div class="field-block">
|
|
132
|
-
<label>Metric preset</label>
|
|
133
|
-
<select :value="preset()" @change="preset.set($event.target.value)">
|
|
118
|
+
<label for="alarm-preset">Metric preset</label>
|
|
119
|
+
<select id="alarm-preset" :value="preset()" @change="preset.set($event.target.value)">
|
|
134
120
|
<template :for="p in presets()">
|
|
135
121
|
<option value="{{ p.key }}">{{ p.label }}</option>
|
|
136
122
|
</template>
|
|
137
123
|
</select>
|
|
138
124
|
</div>
|
|
139
125
|
<div class="field-block">
|
|
140
|
-
<label>Threshold</label>
|
|
141
|
-
<input type="number" :value="threshold()" @input="threshold.set($event.target.value)" placeholder="5" autocomplete="off">
|
|
126
|
+
<label for="alarm-threshold">Threshold</label>
|
|
127
|
+
<input id="alarm-threshold" type="number" :value="threshold()" @input="threshold.set($event.target.value)" placeholder="5" autocomplete="off">
|
|
142
128
|
</div>
|
|
143
129
|
<div class="form-actions">
|
|
144
130
|
<button class="btn" type="button" :disabled="busy()" @click="createAlarm()">Create</button>
|
|
@@ -13,27 +13,14 @@ const recent = __d?.assetsRecent ?? [
|
|
|
13
13
|
]
|
|
14
14
|
</script>
|
|
15
15
|
<script client>
|
|
16
|
+
import { useOpConfirm } from '../../functions/useOpConfirm.ts'
|
|
17
|
+
|
|
16
18
|
// assets:invalidate runs live against AWS through /api/serverless/operations/run.
|
|
17
|
-
const opOutput =
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const confirmVerb = derived(() => { const p = pending(); return p ? p.verb : '' })
|
|
23
|
-
const canRun = derived(() => { const p = pending(); return !!p && typed() === p.confirm })
|
|
24
|
-
function askOp(operation, confirm, verb) { pending.set({ operation, confirm, verb }); typed.set('') }
|
|
25
|
-
function cancelOp() { pending.set(null) }
|
|
26
|
-
async function runOp() {
|
|
27
|
-
const p = pending()
|
|
28
|
-
if (!p || typed() !== p.confirm) return
|
|
29
|
-
pending.set(null); typed.set('')
|
|
30
|
-
opShown.set(true); opOutput.set('Running ' + p.operation + '...')
|
|
31
|
-
try {
|
|
32
|
-
const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.confirm }) })
|
|
33
|
-
const body = await res.json()
|
|
34
|
-
opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
|
|
35
|
-
} catch (e) { opOutput.set('FAILED ' + p.operation + '\n\n' + ((e && e.message) || e)) }
|
|
36
|
-
}
|
|
19
|
+
const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
|
|
20
|
+
const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.apiConfirm }) })
|
|
21
|
+
const body = await res.json()
|
|
22
|
+
return (body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
|
|
23
|
+
})
|
|
37
24
|
</script>
|
|
38
25
|
<!DOCTYPE html>
|
|
39
26
|
<html lang="en" data-theme="dark">
|
|
@@ -50,7 +37,7 @@ async function runOp() {
|
|
|
50
37
|
<p>Versioned static assets uploaded to S3 and served via CloudFront; <span class="mono">ASSET_URL</span> is injected into the app.</p>
|
|
51
38
|
</div>
|
|
52
39
|
<div class="header-actions">
|
|
53
|
-
<button class="btn sm" type="button" @click="askOp('assets:invalidate', '
|
|
40
|
+
<button class="btn sm" type="button" @click="askOp('assets:invalidate', '{{ assets.bucket }}', 'invalidate the CDN cache for {{ assets.bucket }}', 'invalidate')">Invalidate CDN cache</button>
|
|
54
41
|
</div>
|
|
55
42
|
</header>
|
|
56
43
|
|
|
@@ -77,14 +64,18 @@ async function runOp() {
|
|
|
77
64
|
<div class="section">
|
|
78
65
|
<h2>Recent assets</h2>
|
|
79
66
|
<div class="panel">
|
|
67
|
+
@if (recent.length)
|
|
80
68
|
<table>
|
|
81
|
-
<thead><tr><th>Path</th><th>Type</th><th>Size</th></tr></thead>
|
|
69
|
+
<thead><tr><th scope="col">Path</th><th scope="col">Type</th><th scope="col">Size</th></tr></thead>
|
|
82
70
|
<tbody>
|
|
83
71
|
@foreach (recent as a)
|
|
84
72
|
<tr><td class="mono">{{ a.path }}</td><td style="color:var(--txt2)">{{ a.type }}</td><td>{{ a.size }}</td></tr>
|
|
85
73
|
@endforeach
|
|
86
74
|
</tbody>
|
|
87
75
|
</table>
|
|
76
|
+
@else
|
|
77
|
+
<div class="empty"><strong>No assets deployed</strong><span>Publish an asset build to populate this bucket and CDN history.</span></div>
|
|
78
|
+
@endif
|
|
88
79
|
<p class="note">Sync with <span class="mono">cloud assets:deploy</span> · invalidate with <span class="mono">cloud assets:invalidate</span></p>
|
|
89
80
|
</div>
|
|
90
81
|
</div>
|
|
@@ -40,8 +40,8 @@ const trend = __d?.costTrend ?? [5.9, 6.2, 7.1, 6.8, 7.4, 8.0, 7.6, 9.1, 8.4, 7.
|
|
|
40
40
|
|
|
41
41
|
const totalServices = services.reduce((s, x) => s + x.usd, 0)
|
|
42
42
|
function pct(v, max) { return Math.round((v / max) * 100) }
|
|
43
|
-
const maxService = Math.max(...services.map(s => s.usd))
|
|
44
|
-
const maxTrend = Math.max(...trend)
|
|
43
|
+
const maxService = Math.max(1, ...services.map(s => s.usd))
|
|
44
|
+
const maxTrend = Math.max(1, ...trend)
|
|
45
45
|
</script>
|
|
46
46
|
<!DOCTYPE html>
|
|
47
47
|
<html lang="en" data-theme="dark">
|
|
@@ -103,6 +103,7 @@ const maxTrend = Math.max(...trend)
|
|
|
103
103
|
<div>
|
|
104
104
|
<h2>By service</h2>
|
|
105
105
|
<div class="panel">
|
|
106
|
+
@if (services.length)
|
|
106
107
|
@foreach (services as s)
|
|
107
108
|
<div style="padding:11px 0; border-top:1px solid rgba(255,255,255,0.05);">
|
|
108
109
|
<div style="display:flex; align-items:center; gap:12px;">
|
|
@@ -114,13 +115,17 @@ const maxTrend = Math.max(...trend)
|
|
|
114
115
|
</div>
|
|
115
116
|
@endforeach
|
|
116
117
|
<div class="kv" style="margin-top:6px; border-top:1px solid var(--panel-br); padding-top:12px;"><span>total</span> <b>${{ totalServices.toFixed(2) }}</b></div>
|
|
118
|
+
@else
|
|
119
|
+
<div class="empty"><strong>No cost data</strong><span>Cost allocation appears after provider billing data is available for this environment.</span></div>
|
|
120
|
+
@endif
|
|
117
121
|
</div>
|
|
118
122
|
</div>
|
|
119
123
|
<div>
|
|
120
124
|
<h2>Lambda by function</h2>
|
|
121
125
|
<div class="panel">
|
|
126
|
+
@if (perFn.length)
|
|
122
127
|
<table>
|
|
123
|
-
<thead><tr><th>Fn</th><th>Requests</th><th>GB-sec</th><th>Cost</th></tr></thead>
|
|
128
|
+
<thead><tr><th scope="col">Fn</th><th scope="col">Requests</th><th scope="col">GB-sec</th><th scope="col">Cost</th></tr></thead>
|
|
124
129
|
<tbody>
|
|
125
130
|
@foreach (perFn as f)
|
|
126
131
|
<tr>
|
|
@@ -132,15 +137,22 @@ const maxTrend = Math.max(...trend)
|
|
|
132
137
|
@endforeach
|
|
133
138
|
</tbody>
|
|
134
139
|
</table>
|
|
140
|
+
@else
|
|
141
|
+
<div class="empty"><strong>No function cost data</strong><span>Function-level estimates appear after the first metered invocations.</span></div>
|
|
142
|
+
@endif
|
|
135
143
|
</div>
|
|
136
144
|
<div style="height:16px"></div>
|
|
137
145
|
<h2>Optimize</h2>
|
|
138
146
|
<div class="panel">
|
|
147
|
+
@if (services.length)
|
|
139
148
|
<p class="note" style="margin-top:0">Biggest lever: <b style="color:var(--txt)">{{ services[0].name }}</b> at ${{ services[0].usd.toFixed(2) }}.</p>
|
|
140
149
|
<p class="note">• Right-size memory - over-provisioned MB inflates GB-seconds.</p>
|
|
141
150
|
<p class="note">• Drop unused <span class="mono">provisionedConcurrency</span> for ping-based <span class="mono">warm</span> if cold starts are tolerable.</p>
|
|
142
151
|
<p class="note">• Tighten Aurora <span class="mono">db-scale</span> min ACU off-peak.</p>
|
|
143
152
|
<p class="note">Full breakdown: <span class="mono">cloud cost --env {{ app.env }}</span></p>
|
|
153
|
+
@else
|
|
154
|
+
<p class="note" style="margin-top:0">Optimization guidance becomes available with the first service-level cost breakdown.</p>
|
|
155
|
+
@endif
|
|
144
156
|
</div>
|
|
145
157
|
</div>
|
|
146
158
|
</div>
|
|
@@ -12,29 +12,16 @@ const seedMin = aurora?.minAcu ?? 0.5
|
|
|
12
12
|
const seedMax = aurora?.maxAcu ?? 4
|
|
13
13
|
</script>
|
|
14
14
|
<script client>
|
|
15
|
+
import { useOpConfirm } from '../../functions/useOpConfirm.ts'
|
|
16
|
+
|
|
15
17
|
// db:scale runs live against AWS through /api/serverless/operations/run.
|
|
16
|
-
const opOutput = state('')
|
|
17
|
-
const opShown = state(false)
|
|
18
|
-
const pending = state(null)
|
|
19
|
-
const typed = state('')
|
|
20
18
|
const scaleMin = state(String(seedMin ?? ''))
|
|
21
19
|
const scaleMax = state(String(seedMax ?? ''))
|
|
22
|
-
const confirmTok
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
async function runOp() {
|
|
28
|
-
const p = pending()
|
|
29
|
-
if (!p || typed() !== p.confirm) return
|
|
30
|
-
pending.set(null); typed.set('')
|
|
31
|
-
opShown.set(true); opOutput.set('Running ' + p.operation + '...')
|
|
32
|
-
try {
|
|
33
|
-
const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.confirm, min: Number(scaleMin()), max: Number(scaleMax()) }) })
|
|
34
|
-
const body = await res.json()
|
|
35
|
-
opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
|
|
36
|
-
} catch (e) { opOutput.set('FAILED ' + p.operation + '\n\n' + ((e && e.message) || e)) }
|
|
37
|
-
}
|
|
20
|
+
const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
|
|
21
|
+
const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.apiConfirm, min: Number(scaleMin()), max: Number(scaleMax()) }) })
|
|
22
|
+
const body = await res.json()
|
|
23
|
+
return (body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
|
|
24
|
+
})
|
|
38
25
|
</script>
|
|
39
26
|
<!DOCTYPE html>
|
|
40
27
|
<html lang="en" data-theme="dark">
|
|
@@ -76,16 +63,16 @@ async function runOp() {
|
|
|
76
63
|
<div class="panel">
|
|
77
64
|
<div class="form-grid">
|
|
78
65
|
<div class="field-block">
|
|
79
|
-
<label>Min ACUs</label>
|
|
80
|
-
<input type="number" step="0.5" min="0.5" :value="scaleMin()" @input="scaleMin.set($event.target.value)" placeholder="{{ seedMin }}" autocomplete="off">
|
|
66
|
+
<label for="aurora-min">Min ACUs</label>
|
|
67
|
+
<input id="aurora-min" type="number" step="0.5" min="0.5" :value="scaleMin()" @input="scaleMin.set($event.target.value)" placeholder="{{ seedMin }}" autocomplete="off">
|
|
81
68
|
</div>
|
|
82
69
|
<div class="field-block">
|
|
83
|
-
<label>Max ACUs</label>
|
|
84
|
-
<input type="number" step="0.5" min="0.5" :value="scaleMax()" @input="scaleMax.set($event.target.value)" placeholder="{{ seedMax }}" autocomplete="off">
|
|
70
|
+
<label for="aurora-max">Max ACUs</label>
|
|
71
|
+
<input id="aurora-max" type="number" step="0.5" min="0.5" :value="scaleMax()" @input="scaleMax.set($event.target.value)" placeholder="{{ seedMax }}" autocomplete="off">
|
|
85
72
|
</div>
|
|
86
73
|
</div>
|
|
87
74
|
<div class="form-actions">
|
|
88
|
-
<button class="btn sm" type="button" @click="askOp('db:scale', '
|
|
75
|
+
<button class="btn sm" type="button" @click="askOp('db:scale', '{{ aurora.id }}', 'scale the Aurora cluster {{ aurora.id }}', 'scale')">Scale</button>
|
|
89
76
|
</div>
|
|
90
77
|
@include('../partials/op-confirm')
|
|
91
78
|
<p class="note">Adjusts the Aurora Serverless v2 capacity range. New writes settle into the range within a few seconds.</p>
|
|
@@ -11,27 +11,14 @@ const deployments = __d?.deploymentsDetail ?? [
|
|
|
11
11
|
function tone(s) { return s === 'success' ? 'ok' : (s === 'rolled-back' ? 'warn' : 'bad') }
|
|
12
12
|
</script>
|
|
13
13
|
<script client>
|
|
14
|
+
import { useOpConfirm } from '../../functions/useOpConfirm.ts'
|
|
15
|
+
|
|
14
16
|
// Rollback + redeploy run live against AWS through /api/serverless/operations/run.
|
|
15
|
-
const opOutput =
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const confirmVerb = derived(() => { const p = pending(); return p ? p.verb : '' })
|
|
21
|
-
const canRun = derived(() => { const p = pending(); return !!p && typed() === p.confirm })
|
|
22
|
-
function askOp(operation, confirm, verb) { pending.set({ operation, confirm, verb }); typed.set('') }
|
|
23
|
-
function cancelOp() { pending.set(null) }
|
|
24
|
-
async function runOp() {
|
|
25
|
-
const p = pending()
|
|
26
|
-
if (!p || typed() !== p.confirm) return
|
|
27
|
-
pending.set(null); typed.set('')
|
|
28
|
-
opShown.set(true); opOutput.set('Running ' + p.operation + '...')
|
|
29
|
-
try {
|
|
30
|
-
const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.confirm }) })
|
|
31
|
-
const body = await res.json()
|
|
32
|
-
opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
|
|
33
|
-
} catch (e) { opOutput.set('FAILED ' + p.operation + '\n\n' + ((e && e.message) || e)) }
|
|
34
|
-
}
|
|
17
|
+
const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
|
|
18
|
+
const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.apiConfirm }) })
|
|
19
|
+
const body = await res.json()
|
|
20
|
+
return (body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
|
|
21
|
+
})
|
|
35
22
|
</script>
|
|
36
23
|
<!DOCTYPE html>
|
|
37
24
|
<html lang="en" data-theme="dark">
|
|
@@ -48,15 +35,16 @@ async function runOp() {
|
|
|
48
35
|
<p>Every deploy publishes an immutable artifact; activation is atomic and rollback flips back instantly.</p>
|
|
49
36
|
</div>
|
|
50
37
|
<div class="header-actions">
|
|
51
|
-
<button class="btn danger sm" type="button" @click="askOp('rollback', '
|
|
52
|
-
<button class="btn sm" type="button" @click="askOp('redeploy', '
|
|
38
|
+
<button class="btn danger sm" type="button" @click="askOp('rollback', '{{ app.name }}', 'roll back {{ app.name }} to the previous build', 'rollback')">Roll back</button>
|
|
39
|
+
<button class="btn sm" type="button" @click="askOp('redeploy', '{{ app.name }}', 'redeploy {{ app.name }}', 'redeploy')">Redeploy</button>
|
|
53
40
|
</div>
|
|
54
41
|
</header>
|
|
55
42
|
|
|
56
43
|
<div class="section">
|
|
57
44
|
<div class="panel">
|
|
45
|
+
@if (deployments.length)
|
|
58
46
|
<table>
|
|
59
|
-
<thead><tr><th>Build</th><th>Status</th><th>Version</th><th>Deploy hooks</th><th>By</th><th>Took</th><th>When</th></tr></thead>
|
|
47
|
+
<thead><tr><th scope="col">Build</th><th scope="col">Status</th><th scope="col">Version</th><th scope="col">Deploy hooks</th><th scope="col">By</th><th scope="col">Took</th><th scope="col">When</th></tr></thead>
|
|
60
48
|
<tbody>
|
|
61
49
|
@foreach (deployments as d)
|
|
62
50
|
<tr>
|
|
@@ -71,6 +59,9 @@ async function runOp() {
|
|
|
71
59
|
@endforeach
|
|
72
60
|
</tbody>
|
|
73
61
|
</table>
|
|
62
|
+
@else
|
|
63
|
+
<div class="empty"><strong>No deployments yet</strong><span>Deploy the application once to create immutable release history.</span></div>
|
|
64
|
+
@endif
|
|
74
65
|
@include('../partials/op-confirm')
|
|
75
66
|
<p class="note">Rollback restores the previous build's code and env and flips the live alias back instantly. Redeploy re-activates the current build without rebuilding.</p>
|
|
76
67
|
</div>
|
|
@@ -37,8 +37,9 @@ function fmt(n) { return n >= 1000 ? `${(n / 1000).toFixed(n >= 10000 ? 0 : 1)}k
|
|
|
37
37
|
<div class="section">
|
|
38
38
|
<h2>Rules</h2>
|
|
39
39
|
<div class="panel">
|
|
40
|
+
@if (rules.length)
|
|
40
41
|
<table>
|
|
41
|
-
<thead><tr><th>Rule</th><th>Detail</th><th>Action</th><th>Blocked (24h)</th></tr></thead>
|
|
42
|
+
<thead><tr><th scope="col">Rule</th><th scope="col">Detail</th><th scope="col">Action</th><th scope="col">Blocked (24h)</th></tr></thead>
|
|
42
43
|
<tbody>
|
|
43
44
|
@foreach (rules as r)
|
|
44
45
|
<tr>
|
|
@@ -50,6 +51,9 @@ function fmt(n) { return n >= 1000 ? `${(n / 1000).toFixed(n >= 10000 ? 0 : 1)}k
|
|
|
50
51
|
@endforeach
|
|
51
52
|
</tbody>
|
|
52
53
|
</table>
|
|
54
|
+
@else
|
|
55
|
+
<div class="empty"><strong>No WAF rules configured</strong><span>Add managed or rate-limit rules to the application firewall configuration.</span></div>
|
|
56
|
+
@endif
|
|
53
57
|
<p class="note">Configured via <span class="mono">app.firewall</span> in cloud.config.</p>
|
|
54
58
|
</div>
|
|
55
59
|
</div>
|
|
@@ -45,31 +45,18 @@ const modes = (__d?.functionsDetail ?? functions).map(f => f.key)
|
|
|
45
45
|
const initialMode = modes[0] ?? 'http'
|
|
46
46
|
</script>
|
|
47
47
|
<script client>
|
|
48
|
+
import { useOpConfirm } from '../../functions/useOpConfirm.ts'
|
|
49
|
+
|
|
48
50
|
// Per-function config runs live against AWS through /api/serverless/functions/config.
|
|
49
51
|
const mode = state(initialMode)
|
|
50
52
|
const mem = state('1024')
|
|
51
53
|
const to = state('28')
|
|
52
|
-
const opOutput = state('')
|
|
53
|
-
const opShown = state(false)
|
|
54
|
-
const pending = state(null)
|
|
55
|
-
const typed = state('')
|
|
56
|
-
const confirmTok = derived(() => { const p = pending(); return p ? p.confirm : '' })
|
|
57
|
-
const confirmVerb = derived(() => { const p = pending(); return p ? p.verb : '' })
|
|
58
|
-
const canRun = derived(() => { const p = pending(); return !!p && typed() === p.confirm })
|
|
59
|
-
function askOp(operation, confirm, verb) { pending.set({ operation, confirm, verb }); typed.set('') }
|
|
60
|
-
function cancelOp() { pending.set(null) }
|
|
61
54
|
function applyConfig() { const m = mode(); askOp(m, m, 'update the ' + m + ' function') }
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
const res = await fetch('/api/serverless/functions/config', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ mode: p.operation, memory: Number(mem()), timeout: Number(to()), confirm: p.confirm }) })
|
|
69
|
-
const body = await res.json()
|
|
70
|
-
opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
|
|
71
|
-
} catch (e) { opOutput.set('FAILED ' + p.operation + '\n\n' + ((e && e.message) || e)) }
|
|
72
|
-
}
|
|
55
|
+
const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
|
|
56
|
+
const res = await fetch('/api/serverless/functions/config', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ mode: p.operation, memory: Number(mem()), timeout: Number(to()), confirm: p.apiConfirm }) })
|
|
57
|
+
const body = await res.json()
|
|
58
|
+
return (body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
|
|
59
|
+
})
|
|
73
60
|
</script>
|
|
74
61
|
<!DOCTYPE html>
|
|
75
62
|
<html lang="en" data-theme="dark">
|
|
@@ -88,9 +75,11 @@ async function runOp() {
|
|
|
88
75
|
</div>
|
|
89
76
|
</header>
|
|
90
77
|
|
|
78
|
+
@if (functions.length)
|
|
91
79
|
@foreach (functions as fn)
|
|
92
80
|
<div class="section">
|
|
93
81
|
<h2><span class="tag">{{ fn.key }}</span> <span class="mono">{{ fn.name }}</span></h2>
|
|
82
|
+
<p class="note"><a href="/operations/workloads?search={{ encodeURIComponent(fn.name) }}">Open normalized workload and release context</a></p>
|
|
94
83
|
<div class="cols">
|
|
95
84
|
<div class="panel">
|
|
96
85
|
<h3>Invocations (24h)</h3>
|
|
@@ -142,26 +131,30 @@ async function runOp() {
|
|
|
142
131
|
</div>
|
|
143
132
|
</div>
|
|
144
133
|
@endforeach
|
|
134
|
+
@else
|
|
135
|
+
<div class="section"><div class="empty"><strong>No functions deployed</strong><span>Deploy the serverless application to create its HTTP, queue, and CLI functions.</span></div></div>
|
|
136
|
+
@endif
|
|
145
137
|
|
|
138
|
+
@if (functions.length)
|
|
146
139
|
<div class="section">
|
|
147
140
|
<h2>Configure function</h2>
|
|
148
141
|
<div class="panel">
|
|
149
142
|
<div class="form-grid">
|
|
150
143
|
<div class="field-block">
|
|
151
|
-
<label>Function</label>
|
|
152
|
-
<select :value="mode()" @change="mode.set($event.target.value)">
|
|
144
|
+
<label for="function-mode">Function</label>
|
|
145
|
+
<select id="function-mode" :value="mode()" @change="mode.set($event.target.value)">
|
|
153
146
|
@foreach (modes as m)
|
|
154
147
|
<option value="{{ m }}">{{ m }}</option>
|
|
155
148
|
@endforeach
|
|
156
149
|
</select>
|
|
157
150
|
</div>
|
|
158
151
|
<div class="field-block">
|
|
159
|
-
<label>Memory (MB)</label>
|
|
160
|
-
<input type="number" min="128" max="10240" :value="mem()" @input="mem.set($event.target.value)" placeholder="1024" autocomplete="off">
|
|
152
|
+
<label for="function-memory">Memory (MB)</label>
|
|
153
|
+
<input id="function-memory" type="number" min="128" max="10240" :value="mem()" @input="mem.set($event.target.value)" placeholder="1024" autocomplete="off">
|
|
161
154
|
</div>
|
|
162
155
|
<div class="field-block">
|
|
163
|
-
<label>Timeout (s)</label>
|
|
164
|
-
<input type="number" min="1" max="900" :value="to()" @input="to.set($event.target.value)" placeholder="28" autocomplete="off">
|
|
156
|
+
<label for="function-timeout">Timeout (s)</label>
|
|
157
|
+
<input id="function-timeout" type="number" min="1" max="900" :value="to()" @input="to.set($event.target.value)" placeholder="28" autocomplete="off">
|
|
165
158
|
</div>
|
|
166
159
|
<div class="form-actions">
|
|
167
160
|
<button class="btn" type="button" @click="applyConfig()">Apply</button>
|
|
@@ -171,6 +164,7 @@ async function runOp() {
|
|
|
171
164
|
<p class="note">Memory is 128 to 10240 MB, timeout is 1 to 900 s. Changes are applied to the live function immediately via <span class="mono">cloud functions:config</span>.</p>
|
|
172
165
|
</div>
|
|
173
166
|
</div>
|
|
167
|
+
@endif
|
|
174
168
|
</div>
|
|
175
169
|
</body>
|
|
176
170
|
</html>
|
|
@@ -6,6 +6,8 @@ const initialLogs = __d?.serverlessLogs ?? []
|
|
|
6
6
|
const emptyReason = __d?.serverlessLogsEmptyReason ?? 'No function logs are available yet.'
|
|
7
7
|
</script>
|
|
8
8
|
<script client>
|
|
9
|
+
import { usePolling } from '../../functions/usePolling.ts'
|
|
10
|
+
|
|
9
11
|
// Reactive aggregated CloudWatch logs across the functions, with level + function
|
|
10
12
|
// filtering and auto-refresh - seeded from build-time data (stx server→client
|
|
11
13
|
// bridge), then live-refreshed. Signals + directives only (no manual DOM).
|
|
@@ -16,15 +18,13 @@ const sources = derived(() => [...new Set(logs().map(l => l.source).filter(Boole
|
|
|
16
18
|
const filtered = derived(() => logs().filter(l =>
|
|
17
19
|
(level() === 'all' || l.level === level()) && (source() === 'all' || l.source === source())))
|
|
18
20
|
function tone(l) { return l === 'error' ? 'bad' : (l === 'warn' ? 'warn' : 'ok') }
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
onMount(() => { refresh(); const id = setInterval(refresh, 8000); return () => clearInterval(id) })
|
|
21
|
+
const { pollingState, pollingError, pollingLabel } = usePolling(async () => {
|
|
22
|
+
const res = await fetch('/api/dashboard-data')
|
|
23
|
+
if (!res.ok) throw new Error('Log refresh failed with HTTP ' + res.status + '.')
|
|
24
|
+
const data = await res.json()
|
|
25
|
+
if (!Array.isArray(data.serverlessLogs)) throw new Error('Log refresh returned an invalid payload.')
|
|
26
|
+
logs.set(data.serverlessLogs)
|
|
27
|
+
}, 8000)
|
|
28
28
|
</script>
|
|
29
29
|
<!DOCTYPE html>
|
|
30
30
|
<html lang="en" data-theme="dark">
|
|
@@ -38,7 +38,7 @@ onMount(() => { refresh(); const id = setInterval(refresh, 8000); return () => c
|
|
|
38
38
|
<h1>Function logs</h1>
|
|
39
39
|
<p>Aggregated CloudWatch logs across the {{ app.name }} functions ({{ app.env }}).</p>
|
|
40
40
|
</div>
|
|
41
|
-
<div class="cmds header-actions"><span class="accent cmd">cloud logs --env {{ app.env }}</span></div>
|
|
41
|
+
<div class="cmds header-actions"><span class="pill" :class="{ ok: pollingState() === 'live', warn: pollingState() !== 'live' }">{{ pollingLabel() }}</span><span class="accent cmd">cloud logs --env {{ app.env }}</span></div>
|
|
42
42
|
</header>
|
|
43
43
|
|
|
44
44
|
<div class="section">
|
|
@@ -75,6 +75,7 @@ onMount(() => { refresh(); const id = setInterval(refresh, 8000); return () => c
|
|
|
75
75
|
</div>
|
|
76
76
|
<div class="compact empty" @show="logs().length > 0 && filtered().length === 0"><strong>No matching logs</strong><span>Try a different level or function filter.</span></div>
|
|
77
77
|
<div class="empty" @show="logs().length === 0"><strong>No logs available</strong><span>{{ emptyReason }}</span></div>
|
|
78
|
+
<p class="bad note" role="status" @show="pollingState() === 'stale'">Showing the last successful snapshot. {{ pollingError() }}</p>
|
|
78
79
|
|
|
79
80
|
<p class="note">Live CloudWatch logs (REPORT/START/END boilerplate stripped) across <span class="mono">http</span>, <span class="mono">queue</span>, <span class="mono">cli</span> and scheduler functions. Auto-refreshes every 8s.</p>
|
|
80
81
|
</div>
|
|
@@ -3,13 +3,10 @@ let __d = null
|
|
|
3
3
|
try { __d = JSON.parse(process.env.TSCLOUD_DASHBOARD_DATA || '') } catch { __d = null }
|
|
4
4
|
const app = __d?.app ?? { name: 'acme', env: 'production' }
|
|
5
5
|
const window = '24h'
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
{ key: 'cli', invocations: 1440, errors: 0, throttles: 0, avgMs: 760, maxMs: 1400, costUsd: 0.3 },
|
|
11
|
-
]
|
|
12
|
-
const invSpark = __d?.invSpark ?? [60, 72, 68, 81, 95, 88, 102, 94, 120, 110, 90, 84, 78, 96, 130, 122, 100, 92, 88, 104, 140, 132, 108, 100]
|
|
6
|
+
const live = !!__d
|
|
7
|
+
const totals = __d?.metricsTotals ?? { invocations: 0, errors: 0, errorRatePct: 0, p95Ms: 0, throttles: 0, coldStartPct: undefined, estCostUsd: undefined, concurrency: 0 }
|
|
8
|
+
const perFn = __d?.metricsPerFn ?? []
|
|
9
|
+
const invSpark = __d?.invSpark ?? []
|
|
13
10
|
function fmt(n) { return n >= 1000 ? `${(n / 1000).toFixed(n >= 10000 ? 0 : 1)}k` : String(n) }
|
|
14
11
|
function pct(v, max) { return Math.round((v / max) * 100) }
|
|
15
12
|
</script>
|
|
@@ -34,20 +31,20 @@ function pct(v, max) { return Math.round((v / max) * 100) }
|
|
|
34
31
|
</header>
|
|
35
32
|
|
|
36
33
|
<div class="grid cards">
|
|
37
|
-
<div class="panel"><h3>Invocations</h3><div class="stat">{{ fmt(totals.invocations) }}</div><p class="note">{{ totals.concurrency
|
|
38
|
-
<div class="panel"><h3>Error rate</h3><div class="stat">{{ totals.errorRatePct }}
|
|
39
|
-
<div class="panel"><h3>p95 latency</h3><div class="stat">{{ totals.p95Ms }}
|
|
40
|
-
<div class="panel"><h3>Est. cost</h3><div class="stat"
|
|
34
|
+
<div class="panel"><h3>Invocations</h3><div class="stat">{{ live ? fmt(totals.invocations) : 'Unavailable' }}</div><p class="note">{{ live ? totals.concurrency + ' concurrent now' : 'CloudWatch collection unavailable' }}</p></div>
|
|
35
|
+
<div class="panel"><h3>Error rate</h3><div class="stat">{{ live ? totals.errorRatePct + '%' : 'Unavailable' }}</div><div class="bar"><i style="width: {{ live ? Math.min(100, totals.errorRatePct * 10) : 0 }}%"></i></div></div>
|
|
36
|
+
<div class="panel"><h3>p95 latency</h3><div class="stat">{{ live ? totals.p95Ms + ' ms' : 'Unavailable' }}</div><p class="note">{{ live && totals.coldStartPct != null ? totals.coldStartPct + '% cold starts' : 'Cold-start signal unavailable' }}</p></div>
|
|
37
|
+
<div class="panel"><h3>Est. cost</h3><div class="stat">{{ live && totals.estCostUsd != null ? '$' + totals.estCostUsd : 'Unavailable' }}</div><p class="note">{{ live ? totals.throttles + ' throttles' : 'Open Observability for collection status' }}</p></div>
|
|
41
38
|
</div>
|
|
42
39
|
|
|
43
40
|
<div class="section">
|
|
44
41
|
<h2>Invocations over time</h2>
|
|
45
42
|
<div class="panel">
|
|
46
|
-
<div class="spark" style="height:96px">
|
|
43
|
+
@if (invSpark.length)<div class="spark" style="height:96px">
|
|
47
44
|
@foreach (invSpark as h)
|
|
48
45
|
<i style="height: {{ pct(h, 140) }}%"></i>
|
|
49
46
|
@endforeach
|
|
50
|
-
</div>
|
|
47
|
+
</div>@else<div class="compact empty"><strong>No historical buckets</strong><span>Open <a href="/operations/observability">Observability</a> for persisted metrics and explicit gaps.</span></div>@endif
|
|
51
48
|
<p class="note">hourly buckets · last {{ window }}</p>
|
|
52
49
|
</div>
|
|
53
50
|
</div>
|
|
@@ -55,24 +52,28 @@ function pct(v, max) { return Math.round((v / max) * 100) }
|
|
|
55
52
|
<div class="section">
|
|
56
53
|
<h2>Per function</h2>
|
|
57
54
|
<div class="panel">
|
|
55
|
+
@if (perFn.length)
|
|
58
56
|
<table>
|
|
59
|
-
<thead><tr><th>Function</th><th>Invocations</th><th>Errors</th><th>Error rate</th><th>Throttles</th><th>Avg</th><th>Max</th><th>Est. cost</th></tr></thead>
|
|
57
|
+
<thead><tr><th scope="col">Function</th><th scope="col">Invocations</th><th scope="col">Errors</th><th scope="col">Error rate</th><th scope="col">Throttles</th><th scope="col">Avg</th><th scope="col">Max</th><th scope="col">Est. cost</th></tr></thead>
|
|
60
58
|
<tbody>
|
|
61
59
|
@foreach (perFn as f)
|
|
62
60
|
<tr>
|
|
63
61
|
<td><span class="tag">{{ f.key }}</span></td>
|
|
64
62
|
<td>{{ fmt(f.invocations) }}</td>
|
|
65
63
|
<td>@if (f.errors > 0)<span class="bad pill">{{ f.errors }}</span>@else<span style="color:var(--txt3)">0</span>@endif</td>
|
|
66
|
-
<td class="mono">{{ (f.errors / f.invocations * 100).toFixed(2) }}
|
|
64
|
+
<td class="mono">{{ f.invocations ? (f.errors / f.invocations * 100).toFixed(2) + '%' : '—' }}</td>
|
|
67
65
|
<td>{{ f.throttles }}</td>
|
|
68
66
|
<td class="mono">{{ f.avgMs }}ms</td>
|
|
69
67
|
<td class="mono">{{ f.maxMs }}ms</td>
|
|
70
|
-
<td style="color:var(--txt2)"
|
|
68
|
+
<td style="color:var(--txt2)">{{ f.costUsd == null ? 'Unavailable' : '$' + f.costUsd }}</td>
|
|
71
69
|
</tr>
|
|
72
70
|
@endforeach
|
|
73
71
|
</tbody>
|
|
74
72
|
</table>
|
|
75
|
-
|
|
73
|
+
@else
|
|
74
|
+
<div class="empty"><strong>No function metrics</strong><span>Metrics appear after a deployed function receives traffic.</span></div>
|
|
75
|
+
@endif
|
|
76
|
+
<p class="note">Source: CloudWatch · {{ window }} aggregation · <a href="/operations/observability">correlate with logs, traces, requests, and releases</a></p>
|
|
76
77
|
</div>
|
|
77
78
|
</div>
|
|
78
79
|
</div>
|