Skip to content

Commit 2e943bf

Browse files
authored
MQTT triggers changelog, setup and CUs, core package first, fix GH action new PR (windmill-labs#863)
1 parent 6185036 commit 2e943bf

File tree

6 files changed

+274
-67
lines changed

6 files changed

+274
-67
lines changed

.github/workflows/trigger_webhook_on_pr.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Trigger Webhook on PR Ready for Review
22

33
on:
44
pull_request:
5-
types: [ready_for_review]
5+
types: [ready_for_review, opened]
66

77
jobs:
88
trigger-webhook:
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
slug: mqtt-triggers
3+
title: MQTT triggers
4+
version: v1.475.0
5+
tags: ['MQTT', 'Triggers']
6+
description: Trigger scripts and flows in response to MQTT broker messages.
7+
features:
8+
[
9+
"Connect to MQTT brokers and trigger runnables in response to published messages.",
10+
"Subscribe to multiple topics with configurable QoS levels.",
11+
"Process messages with basic scripts or use preprocessors for advanced message handling.",
12+
"Access message metadata including topic, QoS level, and MQTT v5 properties.",
13+
"Support for both MQTT v3 and MQTT v5 protocols with configurable options.",
14+
"Automatically generate TypeScript script templates for message processing."
15+
]
16+
docs: /docs/core_concepts/mqtt_triggers
17+
video: https://www.youtube.com/watch?v=T_ava06lqlc
18+
---

docs/core_concepts/42_autoscaling/index.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,4 @@ Autoscaling events can be viewed under the worker group details:
9494

9595
## Billing
9696

97-
In terms of billing for Windmill [Enterprise Edition](/pricing), Windmill measures how long the workers are online with a minute granularity. If you use 10 workers with 2GB for 1/10th of the month, it will count the same as if you had a single worker for the full month.
97+
In terms of billing for Windmill [Enterprise Edition](/pricing), Windmill measures how long the workers are online with a minute granularity. If you use 10 workers with 2GB for 1/10th of the month, it will count the same as if you had a single worker for the full month. It's like if in your [Windmill setup](../../misc/7_plans_details/index.mdx#setup-and-compute-units), the replicas of the worker group would adjust for a given amount of time.

docs/misc/7_plans_details/index.mdx

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,185 @@ To enable the license key, switch from the `windmill` image to the `windmill-ee`
145145

146146
![Use license key](./add_license_key.png 'Use license key')
147147

148+
## Setup and Compute Units
149+
150+
Windmill uses Compute Units (CUs) to measure and track resource usage across your EE instances.
151+
152+
A [compute unit](/pricing#compute-units) (CU) represents the computational resources allocated to a worker based on its memory limit. The memory limit determines the size and capacity of the worker, therefore its Compute Units.
153+
154+
Compute Units are calculated as follows:
155+
- A worker with 1GB memory limit = 0.5 CU
156+
- A worker with 2GB memory limit = 1 CU
157+
- A worker with 4GB memory limit = 2 CUs
158+
- On self-hosted plans, any worker with more than 2GB of memory counts as 2 Compute Units (e.g., a worker with 16GB counts as 2 Compute Units)
159+
- On cloud plans, the number of Compute Units scales linearly with memory (e.g., a 4GB worker = 2 Compute Units, 8GB worker = 4 Compute Units)
160+
- 8 native workers count as 1 compute unit. They go 8 by 8. Native workers are workers within the native worker group. This group is pre-configured to listen to native jobs tags (query languages). Those jobs are executed under a special mode with subworkers for increased throughput. You can set the number of native workers to 0.
161+
162+
### How Compute Units are counted for a subscription
163+
164+
Based on the telemetry your EE instances send, Compute Units are calculated as follows:
165+
- The memory of each worker of all of the prod instances is aggregated against the global compute unit quota
166+
- Compute Units are allocated freely across workers of different sizes based on needs
167+
- The total number of Compute Units is rounded up to the nearest whole number, as there are no half Compute Units
168+
- It only counts workers of all of the prod instances and exclude the other containers like ui, lsp, multi-player, etc.
169+
170+
You can monitor your Compute Units usage from the [Customer Portal](#windmill-customer-portal).
171+
172+
### Example setups and their Compute Units
173+
174+
Below are examples from your setup [docker-compose.yml](https://github.com/windmill-labs/windmill/blob/main/docker-compose.yml) file and their Compute Units.
175+
176+
#### Basic setup (3 CUs)
177+
178+
Calculation: 2 workers × 1 CU each + 1 native worker with NUM_WORKERS=8 = 3 CUs
179+
180+
```yaml
181+
services:
182+
# Other services (db, server, caddy, etc.) don't count towards CUs
183+
184+
windmill_worker_custom_name:
185+
deploy:
186+
replicas: 2 # 2 workers × 1 CU each = 2 CUs
187+
resources:
188+
limits:
189+
memory: 2048M # 2GB = 1 CU per worker
190+
191+
windmill_worker_native:
192+
deploy:
193+
replicas: 1 # 1 worker with subworkers NUM_WORKERS=8 = 1 CU
194+
resources:
195+
limits:
196+
memory: 2048M
197+
environment:
198+
- WORKER_GROUP=native
199+
- NUM_WORKERS=8
200+
```
201+
202+
#### Medium setup (8 CUs)
203+
204+
Calculation: 3 workers × 1 CU each + 1 native worker with NUM_WORKERS=8 = 8 CUs
205+
206+
```yaml
207+
services:
208+
windmill_worker:
209+
deploy:
210+
replicas: 3 # 3 workers × 1 CU each = 3 CUs
211+
resources:
212+
limits:
213+
memory: 2048M # 2GB = 1 CU
214+
215+
windmill_small_worker:
216+
deploy:
217+
replicas: 4 # 4 workers with 1GB memory = 0.5 CUs each = 2 CUs
218+
resources:
219+
limits:
220+
memory: 1024M # 1GB = 0.5 CU
221+
222+
windmill_worker_reports:
223+
deploy:
224+
replicas: 2 # 2 workers × 1 CU each = 2 CUs
225+
resources:
226+
limits:
227+
memory: 2048M # 2GB = 1 CU
228+
environment:
229+
- WORKER_GROUP=reports
230+
231+
windmill_worker_native:
232+
deploy:
233+
replicas: 1 # 1 worker with NUM_WORKERS=8 = 1 CU
234+
resources:
235+
limits:
236+
memory: 2048M
237+
environment:
238+
- WORKER_GROUP=native
239+
- NUM_WORKERS=8
240+
```
241+
242+
#### Large setup (Cloud Plan - 16 CUs)
243+
244+
Note: for now, setups of cloud EE instances are handled directly by the Windmill team. Please reach out to us if you need to configure your setup.
245+
246+
Calculation: 2 workers × 1 CU each + 4 workers × 3 CUs each + 1 native worker with NUM_WORKERS=8 = 16 CUs
247+
248+
```yaml
249+
services:
250+
windmill_worker_standard:
251+
deploy:
252+
replicas: 2 # 2 workers × 1 CU each = 2 CUs
253+
resources:
254+
limits:
255+
memory: 2048M # 2GB = 1 CU per worker
256+
257+
windmill_worker_large:
258+
deploy:
259+
replicas: 4 # 4 workers × 3 CUs each = 12 CUs
260+
resources:
261+
limits:
262+
memory: 6144M # 6GB = 3 CUs per worker
263+
264+
windmill_worker_reports:
265+
deploy:
266+
replicas: 1 # 1 worker × 1 CU = 1 CU
267+
resources:
268+
limits:
269+
memory: 2048M # 2GB = 1 CU
270+
271+
windmill_worker_native:
272+
deploy:
273+
replicas: 1 # 1 worker with 8 subworkers (can't be changed) = 1 CU
274+
resources:
275+
limits:
276+
memory: 2048M
277+
environment:
278+
- WORKER_GROUP=native
279+
- NUM_WORKERS=8
280+
```
281+
282+
#### Large setup (Self-hosted - 12 CUs)
283+
284+
Calculation: 2 workers × 1 CU each + 4 workers × 2 CUs each + 1 native worker with NUM_WORKERS=8 = 12 CUs
285+
286+
```yaml
287+
services:
288+
windmill_worker_standard:
289+
deploy:
290+
replicas: 2 # 2 workers × 1 CU each = 2 CUs
291+
resources:
292+
limits:
293+
memory: 2048M # 2GB = 1 CU per worker
294+
295+
windmill_worker_large:
296+
deploy:
297+
replicas: 4 # 4 workers × 2 CUs each = 8 CUs
298+
resources:
299+
limits:
300+
memory: 6144M # 6GB but capped at 2 CUs per worker
301+
302+
windmill_worker_reports:
303+
deploy:
304+
replicas: 1 # 1 worker × 1 CU = 1 CU
305+
resources:
306+
limits:
307+
memory: 2048M # 2GB = 1 CU
308+
309+
windmill_worker_native:
310+
deploy:
311+
replicas: 1 # 1 worker with NUM_WORKERS=8 = 1 CU
312+
resources:
313+
limits:
314+
memory: 2048M
315+
environment:
316+
- WORKER_GROUP=native
317+
- NUM_WORKERS=8
318+
```
319+
Note: Services like db, windmill_server, lsp, multiplayer, indexer, and caddy don't count towards Compute Units.
320+
321+
### Compute Units and autoscaling
322+
323+
In terms of billing for Windmill Enterprise Edition with [autoscaling](../../core_concepts/42_autoscaling/index.mdx), Windmill measures how long the workers are online with a minute granularity. If you use 10 workers with 2GB for 1/10th of the month, it will count the same as if you had a single worker for the full month.
324+
325+
As for the setup, it's like if the replicas of the worker group would adjust for a given amount of time.
326+
148327
## AWS Marketplace
149328
150329
Windmill is available on the [AWS Marketplace](https://aws.amazon.com/marketplace/seller-profile?id=seller-pxlq6nidwn3lo). We are notified as soon as you have subscribed to a package, a Windmill representative will come to you to give you what you need to start your subscription: license key for the self-hosted EE package, access to dedicated instance for the cloud EE package.

src/components/pricing/PriceCalculator.js

Lines changed: 61 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,67 @@ export default function PriceCalculator({ period, tier, selectedOption }) {
473473
</>
474474
)}
475475

476-
{/* Add the new text here for enterprise plans */}
476+
{/* Move plans section here for enterprise cloud */}
477+
{tier.id === 'tier-enterprise-cloud' && (
478+
<div className="mt-8">
479+
<RadioGroup value={selected} onChange={setSelected}>
480+
<RadioGroup.Label className="sr-only">Server size</RadioGroup.Label>
481+
<div className="space-y-4 mt-4">
482+
{plans.map((plan) => (
483+
<RadioGroup.Option
484+
key={plan.name}
485+
value={plan}
486+
>
487+
{({ checked, active }) => (
488+
<div className={classNames(
489+
checked ? 'border-transparent' : 'border-gray-300',
490+
active ? 'border-blue-600 ring-2 ring-blue-600' : '',
491+
'relative block cursor-pointer rounded-lg border p-3 shadow-sm focus:outline-none sm:flex sm:justify-between'
492+
)}>
493+
<span className="flex items-center w-full">
494+
<span className="flex flex-col text-sm w-full">
495+
<RadioGroup.Label
496+
as="span"
497+
className="font-medium text-gray-900 dark:text-white"
498+
>
499+
{plan.name}
500+
</RadioGroup.Label>
501+
<RadioGroup.Description
502+
as="span"
503+
className="text-gray-500 dark:text-gray-300"
504+
>
505+
<span className="block sm:inline">{plan.description}</span>
506+
</RadioGroup.Description>
507+
<RadioGroup.Description as="div" className="flex w-full justify-end">
508+
+
509+
<span className="text-sm text-gray-900 font-semibold dark:text-white">
510+
${calculatePrice(plan.price, period.value).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
511+
</span>
512+
<span className="text-sm text-gray-500 dark:text-gray-300">
513+
{period.value === 'annually' ? '/yr' : '/mo'}
514+
</span>
515+
</RadioGroup.Description>
516+
</span>
517+
</span>
518+
519+
<span
520+
className={classNames(
521+
'border',
522+
checked ? 'border-blue-600' : 'border-transparent',
523+
'pointer-events-none absolute -inset-px rounded-lg'
524+
)}
525+
aria-hidden="true"
526+
/>
527+
</div>
528+
)}
529+
</RadioGroup.Option>
530+
))}
531+
</div>
532+
</RadioGroup>
533+
</div>
534+
)}
535+
536+
{/* Add the simulation text here for enterprise plans */}
477537
{(tier.id === 'tier-enterprise-selfhost' || tier.id === 'tier-enterprise-cloud') && (
478538
<p className="mt-6 text-sm text-gray-600 dark:text-gray-200">
479539
Get a simulation of the number of Units needed by reproducing your workers config below.{' '}
@@ -623,68 +683,6 @@ export default function PriceCalculator({ period, tier, selectedOption }) {
623683
)}
624684
</ul>
625685
</div>
626-
{tier.id === 'tier-enterprise-cloud' ? (
627-
<div className="mt-8">
628-
<RadioGroup value={selected} onChange={setSelected}>
629-
<RadioGroup.Label className="sr-only">Server size</RadioGroup.Label>
630-
<div className="space-y-4 mt-4">
631-
{plans.map((plan) => (
632-
<RadioGroup.Option
633-
key={plan.name}
634-
value={plan}
635-
className={({ checked, active }) =>
636-
classNames(
637-
checked ? 'border-transparent' : 'border-gray-300',
638-
active ? 'border-blue-600 ring-2 ring-blue-600' : '',
639-
'relative block cursor-pointer rounded-lg border p-3 shadow-sm focus:outline-none sm:flex sm:justify-between'
640-
)
641-
}
642-
>
643-
{({ active, checked }) => (
644-
<>
645-
<span className="flex items-center w-full">
646-
<span className="flex flex-col text-sm w-full">
647-
<RadioGroup.Label
648-
as="span"
649-
className="font-medium text-gray-900 dark:text-white"
650-
>
651-
{plan.name}
652-
</RadioGroup.Label>
653-
<RadioGroup.Description
654-
as="span"
655-
className="text-gray-500 dark:text-gray-300"
656-
>
657-
<span className="block sm:inline">{plan.description}</span>
658-
</RadioGroup.Description>
659-
<RadioGroup.Description as="div" className="flex w-full justify-end">
660-
+
661-
<span className="text-sm text-gray-900 font-semibold dark:text-white">
662-
${calculatePrice(plan.price, period.value).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
663-
</span>
664-
<span className="text-sm text-gray-500 dark:text-gray-300">
665-
{period.value === 'annually' ? '/yr' : '/mo'}
666-
</span>
667-
</RadioGroup.Description>
668-
</span>
669-
</span>
670-
671-
<span
672-
className={classNames(
673-
'border',
674-
checked ? 'border-blue-600' : 'border-transparent',
675-
'pointer-events-none absolute -inset-px rounded-lg'
676-
)}
677-
aria-hidden="true"
678-
/>
679-
</>
680-
)}
681-
</RadioGroup.Option>
682-
))}
683-
</div>
684-
</RadioGroup>
685-
</div>
686-
) : null}
687-
688686
{tier.id === 'tier-team' ? (
689687
<div className="mt-8 flex flex-col gap-1">
690688
<h5 className="font-semibold">Summary</h5>

src/components/pricing/PricingFAQ.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,13 @@ const faqs = [
119119
className="text-blue-600 hover:text-blue-800 dark:text-blue-500 dark:hover:text-blue-600"
120120
>
121121
worker
122-
</Link>{' '}with 2GB of memory limit counts as 1 compute unit. On self-hosted plans, any worker with >2GB of memory counts as 2 compute units (e.g. a worker with 16GB counts as 2 compute units).
122+
</Link>{' '}with 2GB of memory limit counts as 1 compute unit. On self-hosted plans, any worker with >2GB of memory counts as 2 compute units (e.g. a worker with 16GB counts as 2 compute units). For detailed information on how your setup translates to compute units, see the{' '}
123+
<Link
124+
to="/docs/misc/plans_details#setup-and-compute-units"
125+
className="text-blue-600 hover:text-blue-800 dark:text-blue-500 dark:hover:text-blue-600"
126+
>
127+
setup and compute units guide
128+
</Link>.
123129
</span>
124130
)
125131
},
@@ -193,7 +199,13 @@ const faqs = [
193199
>
194200
workers
195201
</a>
196-
, pricing is based on compute units. A compute unit corresponds to 2 worker-gb-month. For example, a worker with 2GB of memory limit (standard worker) counts as 1 compute unit. A worker with 4GB of memory (large worker) counts as 2 compute units. On self-hosted plans, any worker with memory above 2GB counts as 2 compute units (16GB worker counts as 2 compute units). On cloud EE, it scales linearly with the memory limit. The number of compute units is calculated based on the memory limits set for your workers in production instances. You can set memory limits in docker-compose or Kubernetes manifests to control your compute unit usage. Each worker can run up to ~26M jobs per month (at 100ms per job).
202+
, pricing is based on compute units. A compute unit corresponds to 2 worker-gb-month. For example, a worker with 2GB of memory limit (standard worker) counts as 1 compute unit. A worker with 4GB of memory (large worker) counts as 2 compute units. On self-hosted plans, any worker with memory above 2GB counts as 2 compute units (16GB worker counts as 2 compute units). On cloud EE, it scales linearly with the memory limit. The number of compute units is calculated based on the memory limits set for your workers in production instances. You can set memory limits in docker-compose or Kubernetes manifests to control your compute unit usage. For detailed information on how your setup translates to compute units, see the{' '}
203+
<Link
204+
to="/docs/misc/plans_details#setup-and-compute-units"
205+
className="text-blue-600 hover:text-blue-800 dark:text-blue-500 dark:hover:text-blue-600"
206+
>
207+
setup and compute units guide
208+
</Link>. Each worker can run up to ~26M jobs per month (at 100ms per job).
197209
<br />
198210
<br />
199211
Windmill employs{' '}

0 commit comments

Comments
 (0)