Surveiller les réservations BigQuery
En tant qu'administrateur BigQuery, vous pouvez surveiller les réservations dans votre projet en affichant l'utilisation du projet et des emplacements de réservation, ainsi que votre facture basée sur la capacité.
Afficher l'utilisation des emplacements de réservation et des projets
Vous pouvez afficher l'utilisation des emplacements de réservation et des projets de différentes manières :
Vues
INFORMATION_SCHEMA. Pour récupérer des informations sur l'utilisation des projets et des réservations, interrogez les vuesINFORMATION_SCHEMA.JOBS*.Le champ
reservation_iddes vuesINFORMATION_SCHEMA.JOBS*contient le nom de la réservation.Cloud de Confiance console. La console Cloud de Confiance comprend des graphiques qui indiquent l'utilisation des emplacements. Pour en savoir plus, consultez Utiliser les graphiques de ressources administratives.
Journaux d'audit. Utilisez les journaux d'audit pour afficher les métriques sur l'utilisation des emplacements.
La méthode
Jobs. Utilisez la méthode d'APIJobspour afficher les métriques sur l'utilisation des emplacements pour un job.Cloud Monitoring Vous pouvez utiliser Cloud Monitoring pour créer des tableaux de bord permettant de surveiller vos emplacements attribués. Un tableau de bord Cloud Monitoring vous permet d'afficher votre utilisation des emplacements pour chaque réservation et pour chaque type de job, dans tous les projets de la réservation. Pour afficher les métriques d'utilisation des emplacements pour tous les projets qui consomment des emplacements à partir d'une réservation, vous devez ajouter explicitement ces projets consommateurs au champ d'application des métriques du projet dans lequel vous surveillez les métriques. Pour en savoir plus sur les métriques disponibles pour le tableau de bord Cloud Monitoring, consultez Métriques disponibles pour la visualisation.

Comprendre les métriques sur les emplacements
Pour surveiller et gérer efficacement la capacité de calcul BigQuery, vous devez faire la distinction entre les emplacements alloués et les emplacements utilisés :
- Emplacements alloués
- Capacité dédiée à votre projet via les emplacements de référence et les engagements de capacité actifs. Les emplacements attribués ont un impact sur votre quota et votre facturation.
- Emplacements utilisés
- Capacité activement consommée par les jobs en cours d'exécution lors de l'exécution des requêtes. Les créneaux utilisés apparaissent dans les graphiques d'utilisation des ressources.
Étant donné que les emplacements de référence sont des ressources dédiées, le système de quotas les signale comme "utilisés", même lorsqu'aucune requête n'est en cours d'exécution. Par conséquent, l'utilisation du quota indiquée sur la page Quotas et limites du système peut être supérieure à l'utilisation réelle des emplacements affichée sur la page Surveillance.
Comparaison des métriques d'emplacement
Le tableau suivant compare le calcul et l'affichage des métriques de créneaux horaires dans la console Cloud de Confiance :
| Page de la consoleCloud de Confiance | Métrique affichée | Ce qui est comptabilisé | Source de l'écart |
|---|---|---|---|
| Quotas et limites du système | Quota utilisé (nombre total d'emplacements ; consultez les graphiques d'utilisation des quotas) | Emplacements alloués : emplacements de référence de la réservation et engagements actifs. | Inclut les emplacements de référence inactifs et les réservations de basculement inactives dans les régions secondaires. Ne comptabilise pas les emplacements d'autoscaling. |
| Monitoring | Utilisation des emplacements (graphiques d'utilisation des ressources) | Emplacements utilisés : unités de calcul activement consommées par les jobs en cours d'exécution. | Inclut les pics d'autoscaling qui traitent activement les jobs. Exclut les emplacements de référence inactifs et les réservations de basculement inactives. |
Causes courantes des écarts d'utilisation des créneaux
Lorsque vous rapprochez les métriques de créneaux entre la page Quotas et limites du système et la page Surveillance, tenez compte des causes courantes de divergences suivantes :
- Emplacements de référence inactifs : vous avez réservé des emplacements de référence qui n'exécutent aucune requête activement. Étant donné que les emplacements de référence sont une capacité dédiée, le système de quotas les considère comme utilisés, mais les graphiques d'utilisation n'affichent que les emplacements qui exécutent activement des charges de travail.
- Réservations de basculement : si vous configurez la reprise après sinistre gérée, les emplacements de base d'une réservation de basculement sont alloués dans la région secondaire. Ces emplacements apparaissent comme un quota utilisé dans la région secondaire, même lorsque la réservation est inactive et qu'aucun basculement n'a eu lieu. Pour en savoir plus, consultez Considérations relatives aux quotas pour les réservations de basculement.
- Pics d'autoscaling : les graphiques d'utilisation des ressources incluent les emplacements avec autoscaling qui traitent activement des jobs. En revanche, la page Quotas et limites du système ne reflète que la capacité statique allouée (de base et engagements) et ne comptabilise pas les emplacements d'autoscaling.
Afficher votre facture basée sur la capacité
Pour afficher votre facture basée sur la capacité en temps réel, procédez comme suit :
Dans la console Cloud de Confiance , accédez à la page Facturation.
Sélectionnez le projet du compte de facturation pour lequel vous souhaitez afficher la facture.
Accédez à la section Rapports, puis, dans la section Filtres, procédez comme suit :
- Dans la liste Services, sélectionnez BigQuery, puis sélectionnez toutes les options applicables.
- Sélectionnez Tous les SKU dans la liste SKU.
Attribution des coûts de réservation
Cette fonctionnalité vous permet d'attribuer des frais de réservation à l'utilisation spécifique des requêtes pour tous les projets utilisant la réservation. Cette fonctionnalité permet d'obtenir des coûts nets par projet plus précis.
Tous les clients de l'API BigQuery Reservations disposent d'une ligne Attribution des emplacements d'analyse dans leurs données Cloud Billing. Ce poste est inclus sur la page Facturation et dans l'exportation Cloud Billing.
Cet élément de campagne indique les heures d'emplacement utilisées par projet. Il n'entraîne aucun coût et n'a aucune incidence sur le montant total de vos factures.
Journaux d'audit
Les opérations de création, de suppression et de mise à jour des ressources associées aux réservations BigQuery sont enregistrées dans les journaux d'audit du propriétaire du projet. Pour en savoir plus, consultez Journal d'audit.
Surveiller l'autoscaling à l'aide d'un schéma d'informations
Vous pouvez utiliser les scripts SQL suivants pour vérifier les secondes d'utilisation des emplacements facturées pour une édition spécifique. Vous devez exécuter ces scripts dans le projet dans lequel les réservations ont été créées. Le premier script indique les secondes d'utilisation d'emplacements facturées qui sont couvertes par le plan commitment_plan, tandis que le second indique les secondes d'utilisation d'emplacements facturées qui ne sont pas couvertes par un engagement.
Il vous suffit de définir la valeur de trois variables pour exécuter ces scripts :
start_timeend_timeedition_to_check
Les mises en garde suivantes s'appliquent à ces scripts :
Les réservations et les engagements de capacité supprimés sont également supprimés des vues de schéma d'informations, à la fin de la période de conservation des données. Pour obtenir des résultats corrects, spécifiez une période récente ne contenant pas de réservations et d'engagements supprimés.
Le résultat des scripts peut ne pas correspondre exactement à la facture en raison de petites erreurs d'arrondi.
Le script suivant agrège les emplacements d'autoscaling par édition.
Développez pour afficher le script permettant de calculer les secondes de slot d'autoscaling par édition.
SELECT edition, SUM(s.autoscale_current_slots) AS autoscale_slot_seconds FROM `region-us.INFORMATION_SCHEMA.RESERVATIONS_TIMELINE` m JOIN m.per_second_details s WHERE period_start BETWEEN '2025-09-28' AND '2025-09-29' GROUP BY edition ORDER BY edition
Le script suivant agrège les emplacements d'autoscaling par réservation.
Développez pour afficher le script permettant de calculer les secondes d'emplacement d'autoscaling par réservation.
select reservation_id, sum(s.autoscale_current_slots) as autoscale_slot_seconds from `region-us.INFORMATION_SCHEMA.RESERVATIONS_TIMELINE` m LEFT JOIN m.per_second_details s WHERE period_start between '2025-09-28' and '2025-09-29' group by reservation_id order by reservation_id
Développez pour afficher le script permettant de calculer les secondes de créneaux à partir des engagements.
DECLARE start_time,end_time TIMESTAMP; DECLARE edition_to_check STRING; /* Google uses Pacific Time to calculate the billing period for all customers, regardless of their time zone. Use the following format if you want to match the billing report. Change the start_time and end_time values to match the desired window. */ /* The following three variables (start_time, end_time, and edition_to_check) are the only variables that you need to set in the script. During daylight savings time, the start_time and end_time variables should follow this format: 2024-02-20 00:00:00-08. */ SET start_time = "2023-07-20 00:00:00-07"; SET end_time = "2023-07-28 00:00:00-07"; SET edition_to_check = 'ENTERPRISE'; /* The following function returns the slot seconds for the time window between two capacity changes. For example, if there are 100 slots between (2023-06-01 10:00:00, 2023-06-01 11:00:00), then during that window the total slot seconds will be 100 * 3600. This script calculates a specific window (based on the variables defined above), which is why the following script includes script_start_timestamp_unix_millis and script_end_timestamp_unix_millis. */ CREATE TEMP FUNCTION GetSlotSecondsBetweenChanges( slots FLOAT64, range_begin_timestamp_unix_millis FLOAT64, range_end_timestamp_unix_millis FLOAT64, script_start_timestamp_unix_millis FLOAT64, script_end_timestamp_unix_millis FLOAT64) RETURNS INT64 LANGUAGE js AS r""" if (script_end_timestamp_unix_millis < range_begin_timestamp_unix_millis || script_start_timestamp_unix_millis > range_end_timestamp_unix_millis) { return 0; } var begin = Math.max(script_start_timestamp_unix_millis, range_begin_timestamp_unix_millis) var end = Math.min(script_end_timestamp_unix_millis, range_end_timestamp_unix_millis) return slots * Math.ceil((end - begin) / 1000.0) """; /* Sample CAPACITY_COMMITMENT_CHANGES data (unrelated columns ignored): +---------------------+------------------------+-----------------+--------+------------+--------+ | change_timestamp | capacity_commitment_id | commitment_plan | state | slot_count | action | +---------------------+------------------------+-----------------+--------+------------+--------+ | 2023-07-20 19:30:27 | 12954109101902401697 | ANNUAL | ACTIVE | 100 | CREATE | | 2023-07-27 22:29:21 | 11445583810276646822 | FLEX | ACTIVE | 100 | CREATE | | 2023-07-27 23:10:06 | 7341455530498381779 | MONTHLY | ACTIVE | 100 | CREATE | | 2023-07-27 23:11:06 | 7341455530498381779 | FLEX | ACTIVE | 100 | UPDATE | The last row indicates a special change from MONTHLY to FLEX, which happens because of commercial migration. */ WITH /* Information containing which commitment might have plan updated (e.g. renewal or commercial migration). For example: +------------------------+------------------+--------------------+--------+------------+--------+-----------+----------------------------+ | change_timestamp | capacity_commitment_id | commitment_plan | state | slot_count | action | next_plan | next_plan_change_timestamp | +---------------------+------------------------+-----------------+--------+------------+--------+-----------+----------------------------+ | 2023-07-20 19:30:27 | 12954109101902401697 | ANNUAL | ACTIVE | 100 | CREATE | ANNUAL | 2023-07-20 19:30:27 | | 2023-07-27 22:29:21 | 11445583810276646822 | FLEX | ACTIVE | 100 | CREATE | FLEX | 2023-07-27 22:29:21 | | 2023-07-27 23:10:06 | 7341455530498381779 | MONTHLY | ACTIVE | 100 | CREATE | FLEX | 2023-07-27 23:11:06 | | 2023-07-27 23:11:06 | 7341455530498381779 | FLEX | ACTIVE | 100 | UPDATE | FLEX | 2023-07-27 23:11:06 | */ commitments_with_next_plan AS ( SELECT *, IFNULL( LEAD(commitment_plan) OVER ( PARTITION BY capacity_commitment_id ORDER BY change_timestamp ASC ), commitment_plan) next_plan, IFNULL( LEAD(change_timestamp) OVER ( PARTITION BY capacity_commitment_id ORDER BY change_timestamp ASC ), change_timestamp) next_plan_change_timestamp FROM `region-us.INFORMATION_SCHEMA.CAPACITY_COMMITMENT_CHANGES_BY_PROJECT` ), /* Insert a 'DELETE' action for those with updated plans. The FLEX commitment '7341455530498381779' is has no 'CREATE' action, and is instead labeled as an 'UPDATE' action. For example: +---------------------+------------------------+-----------------+--------+------------+--------+ | change_timestamp | capacity_commitment_id | commitment_plan | state | slot_count | action | +---------------------+------------------------+-----------------+--------+------------+--------+ | 2023-07-20 19:30:27 | 12954109101902401697 | ANNUAL | ACTIVE | 100 | CREATE | | 2023-07-27 22:29:21 | 11445583810276646822 | FLEX | ACTIVE | 100 | CREATE | | 2023-07-27 23:10:06 | 7341455530498381779 | MONTHLY | ACTIVE | 100 | CREATE | | 2023-07-27 23:11:06 | 7341455530498381779 | FLEX | ACTIVE | 100 | UPDATE | | 2023-07-27 23:11:06 | 7341455530498381779 | MONTHLY | ACTIVE | 100 | DELETE | */ capacity_changes_with_additional_deleted_event_for_changed_plan AS ( SELECT next_plan_change_timestamp AS change_timestamp, project_id, project_number, capacity_commitment_id, commitment_plan, state, slot_count, 'DELETE' AS action, commitment_start_time, commitment_end_time, failure_status, renewal_plan, user_email, edition, is_flat_rate, FROM commitments_with_next_plan WHERE commitment_plan <> next_plan UNION ALL SELECT * FROM `region-us.INFORMATION_SCHEMA.CAPACITY_COMMITMENT_CHANGES_BY_PROJECT` ), /* The committed_slots change the history. For example: +---------------------+------------------------+------------------+-----------------+ | change_timestamp | capacity_commitment_id | slot_count_delta | commitment_plan | +---------------------+------------------------+------------------+-----------------+ | 2023-07-20 19:30:27 | 12954109101902401697 | 100 | ANNUAL | | 2023-07-27 22:29:21 | 11445583810276646822 | 100 | FLEX | | 2023-07-27 23:10:06 | 7341455530498381779 | 100 | MONTHLY | | 2023-07-27 23:11:06 | 7341455530498381779 | -100 | MONTHLY | | 2023-07-27 23:11:06 | 7341455530498381779 | 100 | FLEX | */ capacity_commitment_slot_data AS ( SELECT change_timestamp, capacity_commitment_id, CASE WHEN action = "CREATE" OR action = "UPDATE" THEN IFNULL( IF( LAG(action) OVER ( PARTITION BY capacity_commitment_id ORDER BY change_timestamp ASC, action ASC ) IN UNNEST(['CREATE', 'UPDATE']), slot_count - LAG(slot_count) OVER ( PARTITION BY capacity_commitment_id ORDER BY change_timestamp ASC, action ASC ), slot_count), slot_count) ELSE IF( LAG(action) OVER (PARTITION BY capacity_commitment_id ORDER BY change_timestamp ASC, action ASC) IN UNNEST(['CREATE', 'UPDATE']), -1 * slot_count, 0) END AS slot_count_delta, commitment_plan FROM capacity_changes_with_additional_deleted_event_for_changed_plan WHERE state = "ACTIVE" AND edition = edition_to_check AND change_timestamp <= end_time ), /* The total_committed_slots history for each plan. For example: +---------------------+---------------+-----------------+ | change_timestamp | capacity_slot | commitment_plan | +---------------------+---------------+-----------------+ | 2023-07-20 19:30:27 | 100 | ANNUAL | | 2023-07-27 22:29:21 | 100 | FLEX | | 2023-07-27 23:10:06 | 100 | MONTHLY | | 2023-07-27 23:11:06 | 0 | MONTHLY | | 2023-07-27 23:11:06 | 200 | FLEX | */ running_capacity_commitment_slot_data AS ( SELECT change_timestamp, SUM(slot_count_delta) OVER ( PARTITION BY commitment_plan ORDER BY change_timestamp RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS capacity_slot, commitment_plan, FROM capacity_commitment_slot_data ), /* The slot_seconds between each changes, partitioned by each plan. For example: +---------------------+--------------+-----------------+ | change_timestamp | slot_seconds | commitment_plan | +---------------------+--------------+-----------------+ | 2023-07-20 19:30:27 | 64617300 | ANNUAL | | 2023-07-27 22:29:21 | 250500 | FLEX | | 2023-07-27 23:10:06 | 6000 | MONTHLY | | 2023-07-27 23:11:06 | 0 | MONTHLY | | 2023-07-27 23:11:06 | 5626800 | FLEX | */ slot_seconds_data AS ( SELECT change_timestamp, GetSlotSecondsBetweenChanges( capacity_slot, UNIX_MILLIS(change_timestamp), UNIX_MILLIS( IFNULL( LEAD(change_timestamp) OVER (PARTITION BY commitment_plan ORDER BY change_timestamp ASC), CURRENT_TIMESTAMP())), UNIX_MILLIS(start_time), UNIX_MILLIS(end_time)) AS slot_seconds, commitment_plan, FROM running_capacity_commitment_slot_data WHERE change_timestamp <= end_time ) /* The final result is similar to the following: +-----------------+--------------------+ | commitment_plan | total_slot_seconds | +-----------------+--------------------+ | ANNUAL | 64617300 | | MONTHLY | 6000 | | FLEX | 5877300 | */ SELECT commitment_plan, SUM(slot_seconds) AS total_slot_seconds FROM slot_seconds_data GROUP BY commitment_plan
Le script suivant vérifie l'utilisation des emplacements qui n'est couverte par aucun engagement, pour une édition spécifique. Cette utilisation englobe deux types d'emplacements : les emplacements soumis à autoscaling et les emplacements de base, qui ne sont couverts par aucun engagement.
Développer pour afficher le script permettant de calculer les secondes d'utilisation d'emplacements non couvertes par des engagements
/* This script has several parts: 1. Calculate the baseline and scaled slots for reservations 2. Calculate the committed slots 3. Join the two results above to calculate the baseline not covered by committed slots 4. Aggregate the number */ -- variables DECLARE start_time, end_time TIMESTAMP; DECLARE edition_to_check STRING; /* Google uses Pacific Time to calculate the billing period for all customers, regardless of their time zone. Use the following format if you want to match the billing report. Change the start_time and end_time values to match the desired window. */ /* The following three variables (start_time, end_time, and edition_to_check) are the only variables that you need to set in the script. During daylight savings time, the start_time and end_time variables should follow this format: 2024-02-20 00:00:00-08. */ SET start_time = "2023-07-20 00:00:00-07"; SET end_time = "2023-07-28 00:00:00-07"; SET edition_to_check = 'ENTERPRISE'; /* The following function returns the slot seconds for the time window between two capacity changes. For example, if there are 100 slots between (2023-06-01 10:00:00, 2023-06-01 11:00:00), then during that window the total slot seconds will be 100 * 3600. This script calculates a specific window (based on the variables defined above), which is why the following script includes script_start_timestamp_unix_millis and script_end_timestamp_unix_millis. */ CREATE TEMP FUNCTION GetSlotSecondsBetweenChanges( slots FLOAT64, range_begin_timestamp_unix_millis FLOAT64, range_end_timestamp_unix_millis FLOAT64, script_start_timestamp_unix_millis FLOAT64, script_end_timestamp_unix_millis FLOAT64) RETURNS INT64 LANGUAGE js AS r""" if (script_end_timestamp_unix_millis < range_begin_timestamp_unix_millis || script_start_timestamp_unix_millis > range_end_timestamp_unix_millis) { return 0; } var begin = Math.max(script_start_timestamp_unix_millis, range_begin_timestamp_unix_millis) var end = Math.min(script_end_timestamp_unix_millis, range_end_timestamp_unix_millis) return slots * Math.ceil((end - begin) / 1000.0) """; /* Sample RESERVATION_CHANGES data (unrelated columns ignored): +---------------------+------------------+--------+---------------+---------------+ | change_timestamp | reservation_name | action | slot_capacity | current_slots | +---------------------+------------------+--------+---------------+---------------+ | 2023-07-27 22:24:15 | res1 | CREATE | 300 | 0 | | 2023-07-27 22:25:21 | res1 | UPDATE | 300 | 180 | | 2023-07-27 22:39:14 | res1 | UPDATE | 300 | 100 | | 2023-07-27 22:40:20 | res2 | CREATE | 300 | 0 | | 2023-07-27 22:54:18 | res2 | UPDATE | 300 | 120 | | 2023-07-27 22:55:23 | res1 | UPDATE | 300 | 0 | Sample CAPACITY_COMMITMENT_CHANGES data (unrelated columns ignored): +---------------------+------------------------+-----------------+--------+------------+--------+ | change_timestamp | capacity_commitment_id | commitment_plan | state | slot_count | action | +---------------------+------------------------+-----------------+--------+------------+--------+ | 2023-07-20 19:30:27 | 12954109101902401697 | ANNUAL | ACTIVE | 100 | CREATE | | 2023-07-27 22:29:21 | 11445583810276646822 | FLEX | ACTIVE | 100 | CREATE | | 2023-07-27 23:10:06 | 7341455530498381779 | MONTHLY | ACTIVE | 100 | CREATE | */ WITH /* The scaled_slots & baseline change history: +---------------------+------------------+------------------------------+---------------------+ | change_timestamp | reservation_name | autoscale_current_slot_delta | baseline_slot_delta | +---------------------+------------------+------------------------------+---------------------+ | 2023-07-27 22:24:15 | res1 | 0 | 300 | | 2023-07-27 22:25:21 | res1 | 180 | 0 | | 2023-07-27 22:39:14 | res1 | -80 | 0 | | 2023-07-27 22:40:20 | res2 | 0 | 300 | | 2023-07-27 22:54:18 | res2 | 120 | 0 | | 2023-07-27 22:55:23 | res1 | -100 | 0 | */ reservation_slot_data AS ( SELECT change_timestamp, reservation_name, CASE action WHEN "CREATE" THEN autoscale.current_slots WHEN "UPDATE" THEN IFNULL( autoscale.current_slots - LAG(autoscale.current_slots) OVER ( PARTITION BY project_id, reservation_name ORDER BY change_timestamp ASC, action ASC ), IFNULL( autoscale.current_slots, IFNULL( -1 * LAG(autoscale.current_slots) OVER ( PARTITION BY project_id, reservation_name ORDER BY change_timestamp ASC, action ASC ), 0))) WHEN "DELETE" THEN IF( LAG(action) OVER ( PARTITION BY project_id, reservation_name ORDER BY change_timestamp ASC, action ASC ) IN UNNEST(['CREATE', 'UPDATE']), -1 * autoscale.current_slots, 0) END AS autoscale_current_slot_delta, CASE action WHEN "CREATE" THEN slot_capacity WHEN "UPDATE" THEN IFNULL( slot_capacity - LAG(slot_capacity) OVER ( PARTITION BY project_id, reservation_name ORDER BY change_timestamp ASC, action ASC ), IFNULL( slot_capacity, IFNULL( -1 * LAG(slot_capacity) OVER ( PARTITION BY project_id, reservation_name ORDER BY change_timestamp ASC, action ASC ), 0))) WHEN "DELETE" THEN IF( LAG(action) OVER ( PARTITION BY project_id, reservation_name ORDER BY change_timestamp ASC, action ASC ) IN UNNEST(['CREATE', 'UPDATE']), -1 * slot_capacity, 0) END AS baseline_slot_delta, FROM `region-us.INFORMATION_SCHEMA.RESERVATION_CHANGES` WHERE edition = edition_to_check AND change_timestamp <= end_time ), -- Convert the above to running total /* +---------------------+-------------------------+----------------+ | change_timestamp | autoscale_current_slots | baseline_slots | +---------------------+-------------------------+----------------+ | 2023-07-27 22:24:15 | 0 | 300 | | 2023-07-27 22:25:21 | 180 | 300 | | 2023-07-27 22:39:14 | 100 | 300 | | 2023-07-27 22:40:20 | 100 | 600 | | 2023-07-27 22:54:18 | 220 | 600 | | 2023-07-27 22:55:23 | 120 | 600 | */ running_reservation_slot_data AS ( SELECT change_timestamp, SUM(autoscale_current_slot_delta) OVER (ORDER BY change_timestamp RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS autoscale_current_slots, SUM(baseline_slot_delta) OVER (ORDER BY change_timestamp RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS baseline_slots, FROM reservation_slot_data ), /* The committed_slots change history. For example: +---------------------+------------------------+------------------+ | change_timestamp | capacity_commitment_id | slot_count_delta | +---------------------+------------------------+------------------+ | 2023-07-20 19:30:27 | 12954109101902401697 | 100 | | 2023-07-27 22:29:21 | 11445583810276646822 | 100 | | 2023-07-27 23:10:06 | 7341455530498381779 | 100 | */ capacity_commitment_slot_data AS ( SELECT change_timestamp, capacity_commitment_id, CASE WHEN action = "CREATE" OR action = "UPDATE" THEN IFNULL( IF( LAG(action) OVER ( PARTITION BY capacity_commitment_id ORDER BY change_timestamp ASC, action ASC ) IN UNNEST(['CREATE', 'UPDATE']), slot_count - LAG(slot_count) OVER ( PARTITION BY capacity_commitment_id ORDER BY change_timestamp ASC, action ASC ), slot_count), slot_count) ELSE IF( LAG(action) OVER (PARTITION BY capacity_commitment_id ORDER BY change_timestamp ASC, action ASC) IN UNNEST(['CREATE', 'UPDATE']), -1 * slot_count, 0) END AS slot_count_delta FROM `region-us.INFORMATION_SCHEMA.CAPACITY_COMMITMENT_CHANGES_BY_PROJECT` WHERE state = "ACTIVE" AND edition = edition_to_check AND change_timestamp <= end_time ), /* The total_committed_slots history. For example: +---------------------+---------------+ | change_timestamp | capacity_slot | +---------------------+---------------+ | 2023-07-20 19:30:27 | 100 | | 2023-07-27 22:29:21 | 200 | | 2023-07-27 23:10:06 | 300 | */ running_capacity_commitment_slot_data AS ( SELECT change_timestamp, SUM(slot_count_delta) OVER (ORDER BY change_timestamp RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS capacity_slot FROM capacity_commitment_slot_data ), /* Add next_change_timestamp to the above data, which will be used when joining with reservation data. For example: +---------------------+-----------------------+---------------+ | change_timestamp | next_change_timestamp | capacity_slot | +---------------------+-----------------------+---------------+ | 2023-07-20 19:30:27 | 2023-07-27 22:29:21 | 100 | | 2023-07-27 22:29:21 | 2023-07-27 23:10:06 | 200 | | 2023-07-27 23:10:06 | 2023-07-31 00:14:37 | 300 | */ running_capacity_commitment_slot_data_with_next_change AS ( SELECT change_timestamp, IFNULL(LEAD(change_timestamp) OVER (ORDER BY change_timestamp ASC), CURRENT_TIMESTAMP()) AS next_change_timestamp, capacity_slot FROM running_capacity_commitment_slot_data ), /* Whenever we have a change in reservations or commitments, the scaled_slots_and_baseline_not_covered_by_commitments will be changed. Hence we get a collection of all the change_timestamp from both tables. +---------------------+ | change_timestamp | +---------------------+ | 2023-07-20 19:30:27 | | 2023-07-27 22:24:15 | | 2023-07-27 22:25:21 | | 2023-07-27 22:29:21 | | 2023-07-27 22:39:14 | | 2023-07-27 22:40:20 | | 2023-07-27 22:54:18 | | 2023-07-27 22:55:23 | | 2023-07-27 23:10:06 | */ merged_timestamp AS ( SELECT change_timestamp FROM running_reservation_slot_data UNION DISTINCT SELECT change_timestamp FROM running_capacity_commitment_slot_data ), /* Change running reservation-slots and make sure we have one row when commitment changes. +---------------------+-------------------------+----------------+ | change_timestamp | autoscale_current_slots | baseline_slots | +---------------------+-------------------------+----------------+ | 2023-07-20 19:30:27 | 0 | 0 | | 2023-07-27 22:24:15 | 0 | 300 | | 2023-07-27 22:25:21 | 180 | 300 | | 2023-07-27 22:29:21 | 180 | 300 | | 2023-07-27 22:39:14 | 100 | 300 | | 2023-07-27 22:40:20 | 100 | 600 | | 2023-07-27 22:54:18 | 220 | 600 | | 2023-07-27 22:55:23 | 120 | 600 | | 2023-07-27 23:10:06 | 120 | 600 | */ running_reservation_slot_data_with_merged_timestamp AS ( SELECT change_timestamp, IFNULL( autoscale_current_slots, IFNULL( LAST_VALUE(autoscale_current_slots IGNORE NULLS) OVER (ORDER BY change_timestamp ASC), 0)) AS autoscale_current_slots, IFNULL( baseline_slots, IFNULL(LAST_VALUE(baseline_slots IGNORE NULLS) OVER (ORDER BY change_timestamp ASC), 0)) AS baseline_slots FROM running_reservation_slot_data RIGHT JOIN merged_timestamp USING (change_timestamp) ), /* Join the above, so that we will know the number for baseline not covered by commitments. +---------------------+-----------------------+-------------------------+------------------------------------+ | change_timestamp | next_change_timestamp | autoscale_current_slots | baseline_not_covered_by_commitment | +---------------------+-----------------------+-------------------------+------------------------------------+ | 2023-07-20 19:30:27 | 2023-07-27 22:24:15 | 0 | 0 | | 2023-07-27 22:24:15 | 2023-07-27 22:25:21 | 0 | 200 | | 2023-07-27 22:25:21 | 2023-07-27 22:29:21 | 180 | 200 | | 2023-07-27 22:29:21 | 2023-07-27 22:39:14 | 180 | 100 | | 2023-07-27 22:39:14 | 2023-07-27 22:40:20 | 100 | 100 | | 2023-07-27 22:40:20 | 2023-07-27 22:54:18 | 100 | 400 | | 2023-07-27 22:54:18 | 2023-07-27 22:55:23 | 220 | 400 | | 2023-07-27 22:55:23 | 2023-07-27 23:10:06 | 120 | 400 | | 2023-07-27 23:10:06 | 2023-07-31 00:16:07 | 120 | 300 | */ scaled_slots_and_baseline_not_covered_by_commitments AS ( SELECT r.change_timestamp, IFNULL(LEAD(r.change_timestamp) OVER (ORDER BY r.change_timestamp ASC), CURRENT_TIMESTAMP()) AS next_change_timestamp, r.autoscale_current_slots, IF( r.baseline_slots - IFNULL(c.capacity_slot, 0) > 0, r.baseline_slots - IFNULL(c.capacity_slot, 0), 0) AS baseline_not_covered_by_commitment FROM running_reservation_slot_data_with_merged_timestamp r LEFT JOIN running_capacity_commitment_slot_data_with_next_change c ON r.change_timestamp >= c.change_timestamp AND r.change_timestamp < c.next_change_timestamp ), /* The slot_seconds between each changes. For example: +---------------------+--------------------+ | change_timestamp | slot_seconds | +---------------------+--------------+ | 2023-07-20 19:30:27 | 0 | | 2023-07-27 22:24:15 | 13400 | | 2023-07-27 22:25:21 | 91580 | | 2023-07-27 22:29:21 | 166320 | | 2023-07-27 22:39:14 | 13200 | | 2023-07-27 22:40:20 | 419500 | | 2023-07-27 22:54:18 | 40920 | | 2023-07-27 22:55:23 | 459160 | | 2023-07-27 23:10:06 | 11841480 | */ slot_seconds_data AS ( SELECT change_timestamp, GetSlotSecondsBetweenChanges( autoscale_current_slots + baseline_not_covered_by_commitment, UNIX_MILLIS(change_timestamp), UNIX_MILLIS(next_change_timestamp), UNIX_MILLIS(start_time), UNIX_MILLIS(end_time)) AS slot_seconds FROM scaled_slots_and_baseline_not_covered_by_commitments WHERE change_timestamp <= end_time AND next_change_timestamp > start_time ) /* Final result for this example: +--------------------+ | total_slot_seconds | +--------------------+ | 13045560 | */ SELECT SUM(slot_seconds) AS total_slot_seconds FROM slot_seconds_data
Dépannage
Cette section explique comment résoudre les problèmes courants liés à la surveillance des réservations BigQuery et de l'utilisation des emplacements.
Les métriques d'utilisation des emplacements ne correspondent pas INFORMATION_SCHEMA
Si vous constatez des écarts entre les métriques d'utilisation des emplacements dans les graphiques de ressources et les données INFORMATION_SCHEMA, essayez ce qui suit :
- Réduisez la précision. Modifiez la précision du graphique pour afficher des intervalles d'une seconde au lieu d'une heure.
- Aligner l'agrégation : Assurez-vous d'utiliser des méthodes d'agrégation cohérentes entre les graphiques de ressources et les données
INFORMATION_SCHEMA. Par exemple, pour mieux refléter l'utilisation maximale dans les graphiques de ressources, définissez l'agrégation de métriques sur p99 ou p90 de manière cohérente.
Les emplacements empruntés s'affichent lorsque les emplacements inactifs sont désactivés.
Vos graphiques de surveillance peuvent afficher une valeur non nulle pour borrowed_slots même si ignore_idle_slots=true est défini pour une ou plusieurs réservations. Ce paramètre empêche une réservation d'emprunter des emplacements inactifs, mais ne l'empêche pas de prêter ses emplacements inutilisés à d'autres réservations.
Ces créneaux empruntés s'affichent dans les cas suivants :
Prêt à d'autres réservations : une réservation avec
ignore_idle_slots=truepeut prêter ses emplacements de référence inutilisés à d'autres réservations de la même édition qui autorisent l'emprunt d'emplacements inactifs (ignore_idle_slots=false). Si toutes les réservations d'une édition ontignore_idle_slots=true, les emplacements inactifs ne sont pas partagés entre elles.Par exemple, supposons que la réservation A comporte 100 emplacements, 0 utilisation et soit configurée avec
ignore_idle_slots=true. La réservation B se trouve dans la même édition et le même projet. Elle dispose de 100 emplacements, mais en nécessite 150 pour sa charge de travail. Elle est configurée avecignore_idle_slots=false. La réservation B peut emprunter 50 emplacements inactifs à la réservation A pour répondre à ses besoins. Dans ce cas, les graphiques de surveillance indiquent 50lent_slotspour la réservation A et 50borrowed_slotspour la réservation B.Utilisation dépassant la capacité : si l'utilisation des emplacements d'une réservation dépasse temporairement sa capacité (emplacements de référence + emplacements liés à l'autoscaling), les graphiques de surveillance affichent cette différence sous la forme
borrowed_slots. Cela peut se produire même pour les réservations avecignore_idle_slots=true.
Le nombre d'emplacements utilisés peut parfois dépasser la somme de vos emplacements de base et de vos emplacements avec autoscaling. Les emplacements excédentaires (par rapport à la somme de vos emplacements de base et de vos emplacements avec autoscaling) ne vous sont pas facturés.
Les emplacements empruntés s'affichent avant que la réservation ne soit entièrement utilisée
Les tableaux de bord de surveillance utilisent des données échantillonnées, qui peuvent ne pas refléter précisément le calendrier d'utilisation des créneaux dans un intervalle d'échantillonnage.
Pour une analyse plus précise de l'utilisation des emplacements, interrogez les colonnes liées aux emplacements inactifs, telles que les colonnes borrowed_slots et lent_slots dans la vue INFORMATION_SCHEMA.RESERVATIONS_TIMELINE.
Étapes suivantes
- En savoir plus sur les forfaits d'engagement de capacité
- Découvrez comment utiliser les graphiques de ressources administratives.
- Découvrez les tarifs de BigQuery.