Il s'agit d'un simple ensemble de données Bigquery qui contient les événements Google Cloud Service Health (CSH).
Vous pouvez l'utiliser pour rechercher des événements et filtrer les incidents qui vous intéressent.
Il se déclenche toutes les minutes. S'il n'y a pas de mise à jour d'une panne existante ou si une nouvelle panne n'est pas détectée, aucune nouvelle ligne n'est insérée.
Vous pouvez également l'utiliser avec l'API Asset Inventory pour corréler les événements dans un emplacement/une région donnée avec les actifs susceptibles d'être impactés.
Quoi qu'il en soit, le tableau de bord CSH
existant fournit les données dans différents formats comme RSS
et JSON
et même si vous pouvez émettre des requêtes et des filtres simples à l'aide de jq
curl -s https://status.cloud.google.com/incidents.json | jq -r ' .[] | select(.service_name == "Google Compute Engine") '
cependant, ce n’est tout simplement pas sous une forme facile à utiliser.
Alors, au lieu de json brut, que diriez-vous d'une table bigquery que vous ou n'importe qui pouvez utiliser...
Voici l'ensemble de données :
Pour l'utiliser, ajoutez d'abord le projet suivant à l'interface utilisateur gcp-status-log
. Une fois cela fait, toute requête que vous émettez utilisera cet ensemble de données mais facturera votre projet pour votre propre utilisation. (c'est-à-dire que je fournis simplement les données... la requête que vous exécutez est ce que vous paierez)
REMARQUE : ce référentiel, cet ensemble de données et ce code ne sont PAS pris en charge par Google. avertissement
bq query --nouse_legacy_sql '
SELECT
DISTINCT(id), service_name,severity,external_desc, begin,`end` , modified
FROM
gcp-status-log.status_dataset.status
WHERE
service_name = "Google Compute Engine"
ORDER BY
modified
'
+----------------------+-----------------------+----------+-----------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+---------------------+
| id | service_name | severity | external_desc | begin | end | modified |
+----------------------+-----------------------+----------+-----------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+---------------------+
| pxD6QciVMd9gLQGcREbV | Google Compute Engine | medium | Requests to and from Google Compute Instances in us-west2 may see increase traffic loss when using the instance's public IP | 2021-05-05 02:11:10 | 2021-05-05 04:54:57 | 2021-05-05 04:54:57 |
| LGFBxyLwbh92E47fAzJ5 | Google Compute Engine | medium | Mutliregional Price for E2 Free Tier core is set incorrectly | 2021-08-01 07:00:00 | 2021-08-04 23:18:00 | 2021-08-05 17:35:12 |
| gwKjX9Lukav15SaFPbBF | Google Compute Engine | medium | us-central1, europe-west1, us-west1, asia-east1: Issue with Local SSDs on Google Compute Engine. | 2021-09-01 02:35:00 | 2021-09-03 03:55:00 | 2021-09-07 21:39:46 |
| rjF86FbooET3FDpMV9w1 | Google Compute Engine | medium | Increased VM failure rates in a subset of Google Cloud zones | 2021-09-17 15:00:00 | 2021-09-17 18:25:00 | 2021-09-20 23:33:53 |
| ZoUf49v2qbJ9xRK63kaM | Google Compute Engine | medium | Some Users might have received credit cards deemed invalid email erroneously. | 2021-11-13 07:14:48 | 2021-11-13 08:29:30 | 2021-11-13 08:29:30 |
| SjJ3FN51MAEJy7cZmoss | Google Compute Engine | medium | Global: pubsub.googleapis.com autoscaling not worked as expected | 2021-12-07 09:56:00 | 2021-12-14 00:59:00 | 2021-12-14 19:59:08 |
+----------------------+-----------------------+----------+-----------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+---------------------+
...et c'est la limite de mes compétences avec BQ. Si vous avez des suggestions de requêtes que vous avez écrites, veuillez m'envoyer une note dans les problèmes de github
Le schéma utilisé ici est à peu près le même format que celui fourni par la sortie JSON du tableau de bord affiché dans incidents.schema.json.
La seule différence est que chaque ligne de BQ est un incident individuel, par opposition à tous les incidents encapsulés dans un seul JSON selon le schéma fourni ci-dessus.
De plus, ce schéma comporte deux nouvelles colonnes :
insert_timestamp
: il s'agit d'un TIMESTAMP
lorsque la ligne/l'événement a été insérésnapshot_hash
: il s'agit du hachage encodé en base64 du fichier incident.json
tel qu'il a été téléchargé.Vous pouvez voir l'exemple de schéma ici dans ce dépôt.
bq show --format=prettyjson --schema gcp-status-log:status_dataset.status
Pour tout le monde, vous pouvez tout configurer vous-même en utilisant une combinaison de
Cloud Scheduler -> Cloud Run -> BigQUery
Quelle est la configuration suivante :
Cloud Scheduler
appelle en toute sécurité un service Cloud Run
Cloud Run
télécharge un fichier à partir d'un bucket GCS contenant le hachage du dernier fichier JSON CSH inséré.Cloud Run
télécharge et analyse les données JSON CSHCloud Run
insère les événements CSH dans BigQuery
bien sûr, ce schéma dépend du fait que le fichier JSON CSH reste avec la même valeur de hachage s'il n'y a pas de mises à jour (par exemple, il n'inclut pas d'horodatage de fraîcheur pour ses propres mises à jour)
export PROJECT_ID= ` gcloud config get-value core/project `
export PROJECT_NUMBER= ` gcloud projects describe $PROJECT_ID --format= ' value(projectNumber) ' `
gcloud services enable containerregistry.googleapis.com
run.googleapis.com
bigquery.googleapis.com
cloudscheduler.googleapis.com
storage.googleapis.com
# # create the datasets. We are using DAY partitioning
bq mk -d --data_location=US status_dataset
bq mk --table status_dataset.status schema.json
# # create service accounts for cloud run and scheduler
gcloud iam service-accounts create schedulerunner --project= $PROJECT_ID
gcloud iam service-accounts create cloudrunsvc --project= $PROJECT_ID
bq add-iam-policy-binding
--member=serviceAccount:cloudrunsvc@ $PROJECT_ID .iam.gserviceaccount.com
--role=roles/bigquery.admin status_dataset.status
gcloud projects add-iam-policy-binding $PROJECT_ID
--member= " serviceAccount:cloudrunsvc@ $PROJECT_ID .iam.gserviceaccount.com "
--role= " roles/bigquery.jobUser "
# create a gcs bucket to store hash of the incidents json file
# the first value of the hash will force a reload of the incidents.json file
gsutil mb -l us-central1 gs:// $PROJECT_ID -status-hash
echo -n " foo " > /tmp/hash.txt
gsutil cp /tmp/hash.txt gs:// $PROJECT_ID -status-hash/
gsutil iam ch serviceAccount:cloudrunsvc@ $PROJECT_ID .iam.gserviceaccount.com:roles/storage.admin gs:// $PROJECT_ID -status-hash/
# # you may also need to allow your users access to the dataset https://cloud.google.com/bigquery/docs/dataset-access-controls
# # build and deploy the cloud run image
docker build -t gcr.io/ $PROJECT_ID /gstatus .
docker push gcr.io/ $PROJECT_ID /gstatus
gcloud run deploy gcp-status --image gcr.io/ $PROJECT_ID /gstatus
--service-account cloudrunsvc@ $PROJECT_ID .iam.gserviceaccount.com
--set-env-vars " BQ_PROJECTID= $PROJECT_ID " --no-allow-unauthenticated
export RUN_URL= ` gcloud run services describe gcp-status --region=us-central1 --format= " value(status.address.url) " `
# # allow cloud scheduler to call cloud run
gcloud run services add-iam-policy-binding gcp-status --region=us-central1
--member=serviceAccount:schedulerunner@ $PROJECT_ID .iam.gserviceaccount.com --role=roles/run.invoker
# # deploy cloud scheduler
gcloud scheduler jobs create http status-scheduler- $region --http-method=GET --schedule " */5 * * * * "
--attempt-deadline=420s --time-zone= " Pacific/Tahiti " --location=us-central1
--oidc-service-account-email=schedulerunner@ $PROJECT_ID .iam.gserviceaccount.com
--oidc-token-audience= $RUN_URL --uri= $RUN_URL
[attendez 5 minutes]
Vous pouvez également combiner les événements bq avec les données d'inventaire des actifs pour déterminer si un événement a un impact sur votre service.
Par exemple, si vous savez qu'un événement dans us-central1-a
a un impact sur les instances GCE, vous pouvez émettre une requête de recherche limitant la liste des actifs potentiels :
$ gcloud organizations list
DISPLAY_NAME ID DIRECTORY_CUSTOMER_ID
esodemoapp2.com 673202286123 C023zwabc
$ gcloud asset search-all-resources --scope= ' organizations/673202286123 '
--query= " location:us-central1-a "
--asset-types= " compute.googleapis.com/Instance " --format= " value(name) "
//compute.googleapis.com/projects/in-perimeter-gcs/zones/us-central1-a/instances/in-perimeter
//compute.googleapis.com/projects/ingress-vpcsc/zones/us-central1-a/instances/ingress
//compute.googleapis.com/projects/fabled-ray-104117/zones/us-central1-a/instances/instance-1
//compute.googleapis.com/projects/fabled-ray-104117/zones/us-central1-a/instances/nginx-vm-1
//compute.googleapis.com/projects/clamav-241815/zones/us-central1-a/instances/instance-1
//compute.googleapis.com/projects/fabled-ray-104117/zones/us-central1-a/instances/windows-1
Vous pouvez également interroger les rôles et autorisations IAM dans le monde entier en utilisant :
Les événements sources sont JSON, vous pouvez donc également potentiellement charger chaque événement dans BQ à l'aide de la prise en charge native BQ pour le type de données JSON.
Ceci peut être une TODO et un exemple de flux de travail comme ceci :
export PROJECT_ID= ` gcloud config get-value core/project `
export PROJECT_NUMBER= ` gcloud projects describe $PROJECT_ID --format= ' value(projectNumber) ' `
bq mk --table status_dataset.json_dataset events:JSON
curl -o incidents.json -s https://status.cloud.google.com/incidents.json
cat incidents.json | jq -c ' .[] | . ' | sed ' s/"/""/g ' | awk ' { print """$0"""} ' - > items.json
bq load --source_format=CSV status_dataset.json_dataset items.json
bq show status_dataset.json_dataset
$ bq show status_dataset.json_dataset
Last modified Schema Total Rows Total Bytes Expiration Time Partitioning Clustered Fields Labels
----------------- ----------------- ------------ ------------- ------------ ------------------- ------------------ --------
08 Apr 09:39:48 | - events: json 125 822184
Ensuite pour interroger, vous pouvez référencer directement chaque fichier :
$ bq query --nouse_legacy_sql '
SELECT events["id"] as id, events["number"] as number, events["begin"] as begin
FROM `status_dataset.json_dataset`
LIMIT 10
'
+------------------------+------------------------+-----------------------------+
| id | number | begin |
+------------------------+------------------------+-----------------------------+
| " ukkfXQc8CEeFZbSTYQi7 " | " 14166479295409213890 " | " 2022-03-31T19:15:00+00:00 " |
| " RmPhfQT9RDGwWLCXS2sC " | " 3617221773064871579 " | " 2022-03-31T18:07:00+00:00 " |
| " B1hD4KAtcxiyAWkcANfV " | " 17742360388109155603 " | " 2022-03-31T15:30:00+00:00 " |
| " 4rRjbE16mteQwUeXPZwi " | " 8134027662519725646 " | " 2022-03-29T21:00:00+00:00 " |
| " 2j8xsJMSyDhmgfJriGeR " | " 5259740469836333814 " | " 2022-03-28T22:30:00+00:00 " |
| " MtMwhU6SXrpBeg5peXqY " | " 17330021626924647123 " | " 2022-03-25T07:00:00+00:00 " |
| " R9vAbtGnhzo6n48SnqTj " | " 2948654908633925955 " | " 2022-03-22T22:30:00+00:00 " |
| " aA3kbJm5nwvVTKnYbrWM " | " 551739384385711524 " | " 2022-03-18T22:20:00+00:00 " |
| " LuGcJVjNTeC5Sb9pSJ9o " | " 5384612291846020564 " | " 2022-03-08T18:07:00+00:00 " |
| " Hko5cWSXxGSsxfiSpg4n " | " 6491961050454270833 " | " 2022-02-22T05:45:00+00:00 " |
+------------------------+------------------------+-----------------------------+
La modification correspondante de Cloud Run impliquerait la création d'une charge au format CSV (puisque depuis 4/8/22
, l'ancien chargeur CSV est pris en charge)
var rlines [] string
for _ , event := range events {
event . InsertTimestamp = now
event . SnapshotHash = sha256Value
strEvent , err := json . Marshal ( event )
if err != nil {
fmt . Printf ( "Error Marshal Event %v" , err )
http . Error ( w , err . Error (), http . StatusInternalServerError )
return
}
// for JSON Datatype
// https://cloud.google.com/bigquery/docs/reference/standard-sql/json-data
line := strings . Replace ( string ( strEvent ), " " " , " " " " , - 1 )
line = fmt . Sprintf ( " " %s " " , line )
rlines = append ( rlines , line )
}
dataString := strings . Join ( rlines , " n " )
rolesSource := bigquery . NewReaderSource ( strings . NewReader ( dataString ))
rolesSource . SourceFormat = bigquery . CSV
Quoi qu'il en soit, le type de données JSON n'est qu'un TODO et je ne sais pas si c'est nécessaire pour le moment
Pourquoi ai-je encore choisi l'heure de Tahiti pour le planificateur ?
Pourquoi pas, voyez par vous-même :