هذه مجموعة بيانات Bigquery بسيطة تحتوي على أحداث Google Cloud Service Health (CSH).
يمكنك استخدام هذا للاستعلام عن الأحداث وتصفية الأحداث التي تهمك.
يتم تشغيله في كل دقيقة. إذا لم يكن هناك تحديث لانقطاع موجود أو لم يتم اكتشاف انقطاع جديد، فلن يتم إدراج صف جديد.
يمكنك أيضًا استخدام هذا مع Asset Inventory API لربط الأحداث في موقع/منطقة معينة مع الأصول التي قد تتأثر.
على أي حال، توفر لوحة معلومات CSH
الحالية البيانات بتنسيقات مختلفة مثل RSS
و JSON
، بينما يمكنك إصدار استعلامات ومرشحات بسيطة باستخدام jq
curl -s https://status.cloud.google.com/incidents.json | jq -r ' .[] | select(.service_name == "Google Compute Engine") '
ومع ذلك، فهو ليس بالشكل الذي يسهل استخدامه.
لذا، بدلاً من json الخام، ماذا عن جدول الاستعلام الكبير الذي يمكنك استخدامه أنت أو أي شخص ...
إليك مجموعة البيانات:
لاستخدام هذا، قم أولاً بإضافة المشروع التالي إلى واجهة المستخدم gcp-status-log
. بمجرد الانتهاء من ذلك، فإن أي استعلام تصدره سيستخدم مجموعة البيانات هذه ولكنه سيحاسب مشروعك على استخدامك الخاص. (أي أنني أقدم البيانات فقط... الاستعلام الذي تقوم بتشغيله هو ما ستدفع مقابله)
ملاحظة: هذا المستودع ومجموعة البيانات والرمز غير مدعوم من قبل Google. تحذير مشتري
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 |
+----------------------+-----------------------+----------+-----------------------------------------------------------------------------------------------------------------------------+---------------------+---------------------+---------------------+
...وهذا هو الحد الأقصى لمهاراتي مع BQ. إذا كان لديك أي استفسارات مقترحة كتبتها، يرجى إرسال ملاحظة لي حول مشكلات جيثب
المخطط المستخدم هنا هو إلى حد كبير نفس التنسيق المقدم من خلال مخرجات JSON للوحة المعلومات الموضحة في events.schema.json.
والفرق الوحيد هو أن كل صف في BQ هو حادث فردي بدلاً من جميع الحوادث المجمعة في JSON واحد وفقًا للمخطط المقدم أعلاه.
بالإضافة إلى ذلك، يحتوي هذا المخطط على عمودين جديدين:
insert_timestamp
: هذا هو TIMESTAMP
الذي تم فيه إدراج الصف/الحدثsnapshot_hash
: هذا هو التجزئة المشفر بـ base64 لملف incident.json
كما تم تنزيله.يمكنك رؤية مثال المخطط هنا في هذا الريبو.
bq show --format=prettyjson --schema gcp-status-log:status_dataset.status
بالنسبة لأي شخص آخر، يمكنك إعداد كل شيء بنفسك باستخدام مجموعة من
Cloud Scheduler -> Cloud Run -> BigQUery
ما هي الاعداد التالية :
Cloud Scheduler
باستدعاء خدمة Cloud Run
بشكل آمنCloud Run
بتنزيل ملف من مجموعة GCS التي تحتوي على تجزئة ملف JSON CSH الذي تم إدراجه مؤخرًاCloud Run
بتنزيل بيانات JSON CSH وتحليلهاCloud Run
بإدراج أحداث CSH في BigQuery
بالطبع يعتمد هذا المخطط على بقاء ملف JSON CSH بنفس قيمة التجزئة في حالة عدم وجود تحديثات (على سبيل المثال، لا يتضمن طابعًا زمنيًا للحداثة لتحديثاته الخاصة)
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
[انتظر 5 دقائق]
يمكنك أيضًا دمج أحداث bq مع بيانات مخزون الأصول للمساعدة في تضييق نطاق ما إذا كان الحدث يؤثر على خدمتك.
على سبيل المثال، إذا كنت تعرف أن هناك حدثًا في us-central1-a
يؤثر على مثيلات الحملة العالمية للتعليم، فيمكنك إصدار استعلام بحث يقيد قائمة الأصول المحتملة:
$ 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
يمكنك أيضًا الاستعلام عن أدوار وأذونات IAM حول العالم باستخدام:
الأحداث المصدر هي JSON لذا من المحتمل أيضًا تحميل كل حدث في BQ باستخدام BQ Native Support لـ JSON DataType.
ربما يكون هذا TODO ونموذج سير العمل كما يلي:
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
ثم للاستعلام، يمكنك الرجوع إلى كل ملف مباشرة:
$ 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 " |
+------------------------+------------------------+-----------------------------+
سيتضمن التعديل المقابل لـ Cloud Run إنشاء تحميل بتنسيق CSV (نظرًا لأنه اعتبارًا من 4/8/22
، أصبح مُحمل CSV القديم مدعومًا)
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
على أي حال، نوع بيانات JSON هو مجرد TODO ولست متأكدًا مما إذا كان ضروريًا في الوقت الحالي
لماذا اخترت توقيت تاهيتي مرة أخرى للمجدول؟
لماذا لا، انظر لنفسك: