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 limit
  • license.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 needed
  • 70-90% = Approaching the limit, plan for license expansion
  • > 90% = Near capacity, at risk of rejecting new users
  • 100% = 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 users
  • license.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 utilization
  • 70-90% = Approaching the limit, monitor closely during peak hours
  • > 90% = Near capacity, Connect may reject Shiny users during peak usage
  • 100% = 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).

Note

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 needed
  • 30-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.