New to Kestra?
Use blueprints to kickstart your first workflows.
Track DigitalOcean sprawl with Kestra. Count droplets, volumes, databases, load balancers, clusters, firewalls, and domains in parallel and post to Slack.
Know what your DigitalOcean account is running before the invoice tells you. This blueprint sweeps seven resource types in parallel, droplets, block storage volumes, managed database clusters, load balancers, Kubernetes clusters, firewalls, and DNS zones, and posts one Slack digest with every count. Each listing uses fetchType: NONE, which asks the API only for totals, so the report is fast, cheap, and safe to run against accounts of any size. A dedicated failure alert makes sure a broken token or revoked scope never silently stops the reporting.
collect_inventory (io.kestra.plugin.core.flow.Parallel) fans out seven listing tasks concurrently instead of walking them one by one.List tasks, droplet.List, volume.List, database.List, loadbalancer.List, kubernetes.List, firewall.List, and domain.List, configured with fetchType: NONE so only the API's total count is returned, not the resources themselves.report (io.kestra.plugin.slack.notifications.SlackIncomingWebhook) assembles the seven total outputs into one message.errors block posts a distinct alert when any listing fails, typically an expired token or missing scope.Schedule trigger runs the sweep every Monday at 07:00.The DigitalOcean console shows each resource type on its own page and offers no scheduled reporting at all. Getting one number per resource type every week means either clicking through seven pages or maintaining a cron script with an API client, retries, and Slack plumbing. Kestra replaces that with seven declarative tasks and a schedule: parallel execution comes from Parallel, secrets stay in the secret store, failures alert instead of vanishing, and the execution history becomes a time series of your account's footprint.
DIGITALOCEAN_TOKEN: DigitalOcean personal access token.SLACK_WEBHOOK_URL: Slack incoming webhook URL.disabled: false on the weekly trigger, adjusting the cron to your reporting rhythm.fetchType: STORE and feed the stored Ion files into DuckDB or a warehouse to track per-resource details over time, not just counts.domain.record.List per zone for a DNS census, or alert when list_firewalls.total is zero while droplets exist.