Ini adalah Kumpulan Data Bigquery sederhana yang berisi peristiwa Google Cloud Service Health (CSH).
Anda dapat menggunakan ini untuk menanyakan peristiwa dan memfilter insiden yang Anda minati.
Ini dipicu setiap menit. Jika tidak ada pembaruan pada pemadaman yang ada atau pemadaman baru tidak terdeteksi, tidak ada baris baru yang disisipkan.
Anda juga dapat menggunakan ini bersama dengan API Inventaris Aset untuk menghubungkan peristiwa di lokasi/wilayah tertentu dengan aset yang mungkin terkena dampak.
Bagaimanapun, dasbor CSH
yang ada menyediakan data dalam berbagai format seperti RSS
dan JSON
dan meskipun Anda dapat mengeluarkan kueri dan filter sederhana menggunakan jq
curl -s https://status.cloud.google.com/incidents.json | jq -r ' .[] | select(.service_name == "Google Compute Engine") '
Namun, ini tidak dalam bentuk yang mudah digunakan.
Jadi, alih-alih json mentah, bagaimana jika di tabel bigquery Anda atau siapa pun dapat menggunakan...
Berikut kumpulan datanya:
Untuk menggunakannya, pertama-tama tambahkan proyek berikut ke UI gcp-status-log
. Setelah selesai, kueri apa pun yang Anda keluarkan akan menggunakan kumpulan data ini tetapi menagih proyek Anda untuk penggunaan Anda sendiri. (i.,e saya hanya memberikan data...kueri yang Anda jalankan adalah apa yang akan Anda bayar)
CATATAN: repositori, kumpulan data, dan kode ini TIDAK didukung oleh Google. peringatan emptor
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 |
+----------------------+-----------------------+----------+-----------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+---------------------+
...dan itulah batas kemampuanku dengan BQ. Jika Anda memiliki saran pertanyaan yang Anda tulis, tolong kirimkan saya catatan di masalah github
Skema yang digunakan di sini hampir sama dengan format yang disediakan oleh output JSON dari dasbor yang ditunjukkan di Incidents.schema.json.
Satu-satunya perbedaan adalah setiap baris di BQ merupakan insiden individual dan bukan semua insiden yang dikemas dalam satu JSON sesuai skema yang disediakan di atas.
Selain itu, skema ini memiliki dua kolom baru:
insert_timestamp
: ini adalah TIMESTAMP
ketika baris/acara disisipkansnapshot_hash
: ini adalah hash yang dikodekan base64 dari file incident.json
saat diunduh.Anda dapat melihat contoh skema di repo ini.
bq show --format=prettyjson --schema gcp-status-log:status_dataset.status
Untuk orang lain, Anda dapat mengatur semuanya sendiri menggunakan kombinasi
Cloud Scheduler -> Cloud Run -> BigQUery
Apa yang diatur berikut ini:
Cloud Scheduler
dengan aman memanggil layanan Cloud Run
Cloud Run
mendownload file dari bucket GCS yang menyimpan hash file JSON CSH yang terakhir dimasukkanCloud Run
mendownload dan mengurai data JSON CSHCloud Run
menyisipkan peristiwa CSH ke BigQuery
tentu saja skema ini bergantung pada file JSON CSH yang tersisa dengan nilai hash yang sama jika tidak ada pembaruan (misalnya, tidak menyertakan stempel waktu kesegaran untuk pembaruannya sendiri)
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
[tunggu 5 menit]
Anda juga dapat menggabungkan peristiwa bq dengan data inventaris aset untuk membantu mempersempit apakah suatu peristiwa memengaruhi layanan Anda.
Misalnya, jika Anda mengetahui ada peristiwa di us-central1-a
yang memengaruhi instance GCE, Anda dapat mengeluarkan kueri penelusuran yang membatasi daftar aset potensial:
$ 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
Anda juga dapat menanyakan peran dan izin IAM di seluruh dunia menggunakan:
Peristiwa sumber adalah JSON sehingga Anda juga berpotensi memuat setiap peristiwa ke dalam BQ menggunakan Dukungan Asli BQ untuk Tipe Data JSON.
Ini mungkin TODO dan contoh alur kerja mungkin seperti ini:
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
Kemudian untuk menanyakan, Anda dapat mereferensikan setiap file secara langsung:
$ 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 " |
+------------------------+------------------------+-----------------------------+
Modifikasi yang sesuai pada Cloud Run akan melibatkan pembuatan muatan berformat CSV (karena mulai 4/8/22
, pemuat lama CSV didukung)
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
Bagaimanapun, JSON Datatype hanyalah TODO dan saya tidak yakin apakah itu diperlukan saat ini
Mengapa saya memilih waktu tahiti lagi untuk penjadwal?
Mengapa tidak, lihat sendiri: