Connect license capacity guide
This guide provides metrics, query patterns, and alerting recommendations for monitoring Posit Connect license utilization and expiration using OpenTelemetry signals.
Overview
This guide addresses the following operational question:
- Are we approaching license limits? - Named user utilization, concurrent Shiny user utilization, and license expiration tracking
Are we approaching license limits?
This question addresses license capacity planning: Are we nearing the named user limit? Is the concurrent Shiny user limit being reached? When does the license expire?
License signals to check
Named user utilization
Question: How close are we to the named user license limit?
Primary Metrics:
license.users.current(Gauge) - Current number of named users counting against the license limitlicense.users.limit(Gauge) - Licensed limit on named users
Dimensions: None
Query Pattern:
avg:license.users.current{*} / avg:license.users.limit{*} * 100
license_users_current / license_users_limit * 100
license.users.current / license.users.limit * 100
Interpretation:
< 70%= Healthy utilization, no action needed70-90%= Approaching the limit, plan for license expansion> 90%= Near capacity, at risk of rejecting new users100%= Limit reached
Usage: Display as a gauge or percentage. Track both the ratio over time and the raw license.users.current value to understand growth trends. When the limit is reached, Connect rejects API requests with a license exceeded error (visible as rejection.reason=license, rejection.type=api in the requests.rejected metric).
Concurrent Shiny user utilization
Question: How close are we to the concurrent Shiny user limit?
Primary Metrics:
license.shiny_users.current(Gauge) - Current number of concurrent Shiny userslicense.shiny_users.limit(Gauge) - Licensed limit on concurrent Shiny users
Dimensions: None
Query Pattern:
avg:license.shiny_users.current{*} / avg:license.shiny_users.limit{*} * 100
license_shiny_users_current / license_shiny_users_limit * 100
license.shiny_users.current / license.shiny_users.limit * 100
Interpretation:
< 70%= Healthy utilization70-90%= Approaching the limit, monitor closely during peak hours> 90%= Near capacity, Connect may reject Shiny users during peak usage100%= Limit reached, Connect will reject additional Shiny users
Usage: Display as a gauge or percentage. Unlike the named user limit (which counts distinct users over a time window), the Shiny user limit reflects concurrent sessions and fluctuates with real-time usage. Monitor peak usage periods to understand whether usage reaches the limit. When usage exceeds the limit, Connect rejects Shiny requests (visible as rejection.reason=license, rejection.type=shiny in the requests.rejected metric).
A license.shiny_users.limit or license.users.limit value of 0 means Connect does not enforce the user limit (unlimited). In this case, utilization percentage calculations do not apply.
License expiration
Question: When does the license expire?
Primary Metric: license.expiration.days_remaining (Gauge, days)
Dimensions: None
Query Pattern:
avg:license.expiration.days_remaining{*}
license_expiration_days_remaining
license.expiration.days_remaining
Interpretation:
> 90 days= Healthy, no immediate action needed30-90 days= Plan renewal, begin the procurement process< 30 days= Urgent, prioritize license renewal= 0= License has expired
Usage: Display as a single stat panel. This metric reports negative values when the license expires, making it straightforward to alert on both approaching and past expiration. For evaluation licenses, this reflects the evaluation period remaining.
For recommended alert thresholds on license utilization and expiration, see the alerting recommendations.