Bedrock Model Usage Statistics

Model: {{ model_id }}

{% if endpoint and endpoint != model_id %}

Endpoint: {{ endpoint }}

{% endif %} {% if application_profile_scope %}

{{ scope_label }}: {{ application_profile_scope | join(', ') }}

{% endif %}

Region: {{ region }}{% if region_info and region_info.display_name and region_info.display_name != region %} ({{ region_info.display_name }}){% endif %} {% if region_info and region_info.partition and region_info.partition != 'aws' %} · {{ region_info.partition_name }}{% endif %}

Generated: {{ timestamp }}

{% if quotas.tpm or quotas.rpm or quotas.tpd or quotas.concurrent %}

Quota Limits

{%- macro quota_line(label, quota) %}

{{ label }}: {{ "{:,.0f}".format(quota.value) }}
{% if quota.url | https_url %}[{{ quota.code }}]{% else %}[{{ quota.code }}]{% endif %} {{ quota.name }}

{%- endmacro %} {% for key, label in [('tpm', 'TPM (Tokens Per Minute)'), ('rpm', 'RPM (Requests Per Minute)'), ('tpd', 'TPD (Tokens Per Day)'), ('concurrent', 'Concurrent Requests')] %} {% if quotas[key] %}{{ quota_line(label, quotas[key]) }}{% endif %} {% endfor %}

IMPORTANT: These quotas (and those on the charts) were intelligently mapped with large language model. It is always good to crosscheck with {% if service_quotas_console_url | https_url %}AWS service quotas{% else %}AWS service quotas{% endif %}

{% endif %} {% if imported %}

Imported models have no token or request quotas

Custom Model Import models have no per-model TPM, RPM or TPD quotas, so this report shows usage without limits. Bedrock scales the model copies that serve an imported model with its traffic; throttles mean requests arrived faster than copies were added. See Custom Model Import for details.

{% else %}

⚠️ Important: Understanding Token-Based Throttling

Low TPM/TPD values in this report do not rule out token-based throttling. Bedrock reserves input_tokens + max_tokens from your quota at request start, but CloudWatch only records actual tokens used after completion. If max_tokens is set high (e.g., 64K) but actual output is low, you may hit throttling limits that are invisible in these metrics. To diagnose, check your max_tokens settings and enable model invocation logging. See How tokens are counted in Amazon Bedrock for details.

{% endif %}

Statistics Summary

Note: Numbers are rounded to the nearest integer

{# Table 1: Original Metrics #} {% for period in ['1hour', '1day', '7days', '14days', '30days'] %} {% endfor %} {% set metrics = ['InputTokenCount', 'OutputTokenCount', 'Invocations', 'InvocationThrottles', 'InvocationClientErrors', 'InvocationServerErrors', 'InvocationLatency'] %} {% set stats = ['P50', 'P90', 'Average', 'Total', 'Data Points'] %} {% set metrics_with_total = ['InputTokenCount', 'OutputTokenCount', 'Invocations', 'InvocationThrottles', 'InvocationClientErrors', 'InvocationServerErrors'] %} {% for metric in metrics %} {% set row_class = metric.lower().replace('_', '') + '-row' %} {% for stat in stats %} {% if not (stat == 'Total' and metric not in metrics_with_total) %} {% if loop.first %} {% endif %} {% for period in ['1hour', '1day', '7days', '14days', '30days'] %} {% set metric_data = time_periods[period]['__AGGREGATED__'].get(metric, {}) %} {% if stat == 'P50' %} {% elif stat == 'P90' %} {% elif stat == 'Average' %} {% elif stat == 'Total' %} {% elif stat == 'Data Points' %} {% endif %} {% endfor %} {% endif %} {% endfor %} {% endfor %}
Metric Statistic {{ period.upper() }}
{% set granularity_seconds = granularity_config.get(period, 300) %} {% if granularity_seconds == 60 %}1-min data {% elif granularity_seconds == 300 %}5-min data {% elif granularity_seconds == 3600 %}1-hour data {% else %}{{ granularity_seconds }}s data{% endif %}
{{ metric }}
{% if metric == 'InvocationLatency' %} aggregated with AVERAGE (milliseconds) {% else %} aggregated with SUM {% endif %}
{{ stat }}{{ "{:,}".format(metric_data.p50|round|int) if metric_data.p50 is defined else "0" }}{{ "{:,}".format(metric_data.p90|round|int) if metric_data.p90 is defined else "0" }}{{ "{:,}".format(metric_data.avg|round|int) if metric_data.avg is defined else "0" }}{{ "{:,}".format(metric_data.sum|round|int) if metric_data.sum is defined else "0" }}{{ metric_data.count if metric_data.count is defined else 0 }}
{# Table 2: Rate Metrics (TPM, RPM, TPD) - Always 1-min data #} {% for period in ['1hour', '1day', '7days', '14days', '30days'] %} {% endfor %} {% set rate_metrics = ['TPM_1min', 'RPM_1min', 'TPD'] %} {% set rate_metric_labels = {'TPM_1min': 'TPM', 'RPM_1min': 'RPM', 'TPD': 'TPD'} %} {% set stats = ['P50', 'P90', 'Average', 'Data Points'] %} {% for metric in rate_metrics %} {% if metric != 'TPD' or period != '1hour' %} {% set row_class = metric.lower().replace('_', '') + '-row' %} {% for stat in stats %} {% if loop.first %} {% endif %} {% for period in ['1hour', '1day', '7days', '14days', '30days'] %} {% if metric == 'TPD' and period == '1hour' %} {% else %} {% set metric_data = time_periods[period]['__AGGREGATED__'].get(metric, {}) %} {% if stat == 'P50' %} {% elif stat == 'P90' %} {% elif stat == 'Average' %} {% elif stat == 'Data Points' %} {% endif %} {% endif %} {% endfor %} {% endfor %} {% endif %} {% endfor %}
Metric Statistic {{ period.upper() }}
1-min data
{{ rate_metric_labels[metric] }}
{% if metric in ['TPM_1min', 'TPD'] %} derived from token counts {% elif metric == 'RPM_1min' %} derived from invocations {% endif %}
{{ stat }}N/A{{ "{:,}".format(metric_data.p50|round|int) if metric_data.p50 is defined else "0" }}{{ "{:,}".format(metric_data.p90|round|int) if metric_data.p90 is defined else "0" }}{{ "{:,}".format(metric_data.avg|round|int) if metric_data.avg is defined else "0" }}{{ metric_data.count if metric_data.count is defined else 0 }}
{% if breakdown %}

Usage by {{ breakdown.label }}

{% if breakdown.unavailable %}

Not available: {{ breakdown.unavailable }}

{% else %}

From the model invocation logs in {{ breakdown.log_group }} ({{ local_time(breakdown.coverage.start) }} to {{ local_time(breakdown.coverage.end) }}). Shares are of the endpoint's CloudWatch totals over the covered time; "{{ unattributed_label }}" is usage CloudWatch counted that the logs do not hold.{% if not imported %} Quotas are shared by all callers.{% endif %} {% if breakdown.principal_filter %}Selected principals: {{ breakdown.principal_filter | join(', ') }}.{% endif %}

{% for note in breakdown.notes %}

Note: {{ note }}

{% endfor %} {% for period in period_ms %} {% set section = breakdown.periods.get(period) %} {% if section and section.rows %}
{% if breakdown.kind != 'principal' %}{% else %}{% endif %} {% if period != '1hour' %}{% endif %} {% for row in section.rows %} {% if breakdown.kind != 'principal' %} {% else %}{% endif %} {% if period != '1hour' %}{% endif %} {% endfor %}
{{ breakdown.label }}IAM principalsTags (summed row: its principals)Via Share of tokens Share of requests Tokens Requests TPM P50TPM P90TPM max RPM P50RPM P90RPM maxTPD avgTPD max
{{ row.name }}{{ row.principals | join(', ') }}{% if row.principals %}{{ row.principals | join(', ') }}{% elif row.tags %}{% for key, value in row.tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ row.via | join(', ') }} {% if row.share_tokens is not none %}{{ "{:.1%}".format(row.share_tokens) }}{% else %}N/A{% endif %} {% if row.share_requests is not none %}{{ "{:.1%}".format(row.share_requests) }}{% else %}N/A{% endif %} {{ "{:,.0f}".format(row.tokens) }} {{ "{:,.0f}".format(row.requests) }} {{ "{:,.0f}".format(row.tpm_p50) }}{{ "{:,.0f}".format(row.tpm_p90) }}{{ "{:,.0f}".format(row.tpm_max) }} {{ "{:,.1f}".format(row.rpm_p50) }}{{ "{:,.1f}".format(row.rpm_p90) }}{{ "{:,.1f}".format(row.rpm_max) }}{{ "{:,.0f}".format(row.tpd_avg) }}{{ "{:,.0f}".format(row.tpd_max) }}
TPM by {{ breakdown.label }}
{% endif %} {% endfor %} {% endif %}
{% endif %}

Time Series Graphs

{# Row 1: 1hour and 1day side by side #}
TPM (Tokens Per Minute)
{% if contributions.get('1hour') %}
{% for contrib in contributions['1hour'] %} {% endfor %}
Profile Name ID Tags P50 P90 Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.tpm_p50) }} {{ "{:,.0f}".format(contrib.tpm_p90) }} {{ "{:,.0f}".format(contrib.tpm_avg) }}
{% endif %}
RPM (Requests Per Minute)
{% if contributions.get('1hour') %}
{% for contrib in contributions['1hour'] %} {% endfor %}
Profile Name ID Tags P50 P90 Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.rpm_p50) }} {{ "{:,.0f}".format(contrib.rpm_p90) }} {{ "{:,.0f}".format(contrib.rpm_avg) }}
{% endif %}
Invocation Throttles
{% if contributions.get('1hour') %}
{% for contrib in contributions['1hour'] %} {% endfor %}
Profile Name ID Tags Total
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.throttles) }}
{% endif %}
TPM (Tokens Per Minute)
{% if contributions.get('1day') %}
{% for contrib in contributions['1day'] %} {% endfor %}
Profile Name ID Tags P50 P90 Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.tpm_p50) }} {{ "{:,.0f}".format(contrib.tpm_p90) }} {{ "{:,.0f}".format(contrib.tpm_avg) }}
{% endif %}
RPM (Requests Per Minute)
{% if contributions.get('1day') %}
{% for contrib in contributions['1day'] %} {% endfor %}
Profile Name ID Tags P50 P90 Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.rpm_p50) }} {{ "{:,.0f}".format(contrib.rpm_p90) }} {{ "{:,.0f}".format(contrib.rpm_avg) }}
{% endif %}
TPD (Tokens Per Day)
{% if contributions.get('1day') %}
{% for contrib in contributions['1day'] %} {% endfor %}
Profile Name ID Tags P50 P90 Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.tpd_p50) }} {{ "{:,.0f}".format(contrib.tpd_p90) }} {{ "{:,.0f}".format(contrib.tpd_avg) }}
{% endif %}
Invocation Throttles
{% if contributions.get('1day') %}
{% for contrib in contributions['1day'] %} {% endfor %}
Profile Name ID Tags Total
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.throttles) }}
{% endif %}
TPM (Tokens Per Minute)
{% if contributions.get('7days') %}
{% for contrib in contributions['7days'] %} {% endfor %}
Profile NameIDTagsP50P90Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.tpm_p50) }} {{ "{:,.0f}".format(contrib.tpm_p90) }} {{ "{:,.0f}".format(contrib.tpm_avg) }}
{% endif %}
RPM (Requests Per Minute)
{% if contributions.get('7days') %}
{% for contrib in contributions['7days'] %} {% endfor %}
Profile NameIDTagsP50P90Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.rpm_p50) }} {{ "{:,.0f}".format(contrib.rpm_p90) }} {{ "{:,.0f}".format(contrib.rpm_avg) }}
{% endif %}
TPD (Tokens Per Day)
{% if contributions.get('7days') %}
{% for contrib in contributions['7days'] %} {% endfor %}
Profile NameIDTagsP50P90Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.tpd_p50) }} {{ "{:,.0f}".format(contrib.tpd_p90) }} {{ "{:,.0f}".format(contrib.tpd_avg) }}
{% endif %}
Invocation Throttles
{% if contributions.get('7days') %}
{% for contrib in contributions['7days'] %} {% endfor %}
Profile NameIDTagsTotal
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.throttles) }}
{% endif %}
TPM (Tokens Per Minute)
{% if contributions.get('14days') %}
{% for contrib in contributions['14days'] %} {% endfor %}
Profile NameIDTagsP50P90Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.tpm_p50) }} {{ "{:,.0f}".format(contrib.tpm_p90) }} {{ "{:,.0f}".format(contrib.tpm_avg) }}
{% endif %}
RPM (Requests Per Minute)
{% if contributions.get('14days') %}
{% for contrib in contributions['14days'] %} {% endfor %}
Profile NameIDTagsP50P90Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.rpm_p50) }} {{ "{:,.0f}".format(contrib.rpm_p90) }} {{ "{:,.0f}".format(contrib.rpm_avg) }}
{% endif %}
TPD (Tokens Per Day)
{% if contributions.get('14days') %}
{% for contrib in contributions['14days'] %} {% endfor %}
Profile NameIDTagsP50P90Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.tpd_p50) }} {{ "{:,.0f}".format(contrib.tpd_p90) }} {{ "{:,.0f}".format(contrib.tpd_avg) }}
{% endif %}
Invocation Throttles
{% if contributions.get('14days') %}
{% for contrib in contributions['14days'] %} {% endfor %}
Profile NameIDTagsTotal
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.throttles) }}
{% endif %}
TPM (Tokens Per Minute)
{% if contributions.get('30days') %}
{% for contrib in contributions['30days'] %} {% endfor %}
Profile NameIDTagsP50P90Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.tpm_p50) }} {{ "{:,.0f}".format(contrib.tpm_p90) }} {{ "{:,.0f}".format(contrib.tpm_avg) }}
{% endif %}
RPM (Requests Per Minute)
{% if contributions.get('30days') %}
{% for contrib in contributions['30days'] %} {% endfor %}
Profile NameIDTagsP50P90Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.rpm_p50) }} {{ "{:,.0f}".format(contrib.rpm_p90) }} {{ "{:,.0f}".format(contrib.rpm_avg) }}
{% endif %}
TPD (Tokens Per Day)
{% if contributions.get('30days') %}
{% for contrib in contributions['30days'] %} {% endfor %}
Profile NameIDTagsP50P90Average
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.tpd_p50) }} {{ "{:,.0f}".format(contrib.tpd_p90) }} {{ "{:,.0f}".format(contrib.tpd_avg) }}
{% endif %}
Invocation Throttles
{% if contributions.get('30days') %}
{% for contrib in contributions['30days'] %} {% endfor %}
Profile NameIDTagsTotal
{{ contrib.profile_name }} {{ contrib.profile_arn_id }} {% if contrib.profile_tags %}{% for key, value in contrib.profile_tags.items() %}{{ key }}={{ value }}
{% endfor %}{% else %}N/A{% endif %}
{{ "{:,.0f}".format(contrib.throttles) }}
{% endif %}