API Penelusuran Asinkron
Platform Penelusuran di Google Security Operations memungkinkan Anda menggunakan API asinkron untuk kueri yang berjalan lama yang menampilkan set hasil besar hingga 1 juta hasil. API ini memungkinkan Anda memulai penelusuran di seluruh sumber data, termasuk peristiwa Unified Data Model (UDM), deteksi, tabel data, dan Entity Context Graph (ECG), tanpa memblokir aplikasi Anda. Saat menjalankan kueri penelusuran menggunakan API operasi yang berjalan lama (LRO), Anda akan menerima ID operasi. Anda dapat menggunakan ID ini untuk memantau status operasi dan mendapatkan hasil halaman demi halaman.
Prasyarat
Untuk menggunakan API operasi yang berjalan lama, akun utama yang memanggil memerlukan izin Identity and Access Management (IAM) tertentu.
Untuk melakukan tindakan berikut, Anda harus memiliki izin IAM yang sesuai:
- Memulai penelusuran:
chronicle.searchSessions.search - Hasil daftar:
chronicle.searchedResults.listpada resourceSearchSession.
Pastikan akun utama yang memanggil memiliki peran yang memberikan izin ini, misalnya, peran Chronicle API Viewer, Chronicle API Editor, atau Chronicle API Admin.
Menjalankan penelusuran menggunakan LRO API
Ikuti langkah-langkah berikut untuk menjalankan penelusuran menggunakan LRO API:
Memulai penelusuran
Kirim permintaan POST ke metode kustom search di instance Google SecOps.
- Endpoint:
POST /{$api_version}/projects/{project}/locations/{location}/instances/{instance}:search - Metode:
Search - Isi permintaan:
SearchRequest
Contoh berikut menunjukkan objek SearchRequest:
{
"parent": "projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID",
"query": "metadata.event_type = \"USER_LOGIN\"",
"time_range": {},
"start_time": "2026-03-16T14:40:13Z",
"endTime": "2026-03-16T15:40:13Z",
"dialect": "YL2"
}
Permintaan memerlukan parameter utama berikut:
query: String kueri penelusuran.time_range: Interval waktu untuk penelusuran.dialect: Menentukan dialek bahasa sebagaiYL2.- Dialek
SQLtidak didukung untuk pengambilan hasil LRO asinkron menggunakanListSearchedResults(searchedResults.list). - Dialek
RAW_LOGmasih dalam Pratinjau dan mungkin menampilkan error501 UNIMPLEMENTEDjika tidak diaktifkan untuk instance Anda.
- Dialek
result_limit: Opsional. Jumlah maksimum baris yang akan diwujudkan. Nilai defaultnya adalah10000, dan nilai maksimumnya adalah1000000.simulated_data_visibility(atausimulatedDataVisibilitydi JSON): Opsional. Mengontrol apakah hasil penelusuran menyertakan peristiwa yang disimulasikan. Tetapkan keSIMULATED_DATA_INCLUDEDuntuk menyertakan peristiwa simulasi dalam hasil penelusuran. Jika tidak ditentukan, parameter ini akan ditetapkan secara default keSIMULATED_DATA_EXCLUDED, yang mengecualikan peristiwa simulasi.
Panggilan ini menampilkan objek google.longrunning.Operation.
Contoh berikut menunjukkan respons operasi yang berhasil:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/operations/OPERATION_ID",
"metadata": {
"@type": "[type.googleapis.com/google.cloud.chronicle.v1main.SearchOperationMetadata](https://type.googleapis.com/google.cloud.chronicle.v1main.SearchOperationMetadata)",
"state": "RUNNING",
"start_time": "2026-03-13T10:00:00Z"
}
}
Kolom state: RUNNING menunjukkan bahwa penelusuran sedang berlangsung.
Memantau operasi
Lakukan polling status LRO menggunakan metode GetOperation standar dari layanan google.longrunning.Operations. Gunakan nilai name dari respons sebelumnya.
- Endpoint:
GET /{$api_version}/projects/{project}/locations/{location}/instances/{instance}/operations/{operationID}
Lanjutkan polling hingga kolom done dalam respons GetOperation menampilkan
true.
- Jika operasi berhasil, kolom
metadata.stateakan menampilkanSUCCEEDED, dan kolom respons akan berisi resourceSearchSessionyang dibuat. - Jika operasi gagal, kolom
doneakan menampilkantrue, dan kolom error akan berisi detail kegagalan terkait.
Contoh berikut menunjukkan respons GetOperation yang berhasil:
{
"name": "projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/operations/OPERATION_ID",
"metadata": {
"@type": "[type.googleapis.com/google.cloud.chronicle.v1main.SearchOperation](https://type.googleapis.com/google.cloud.chronicle.v1main.SearchOperation) Metadata",
"state": "SUCCEEDED",
"startTime": "2026-03-16T15:42:11.037506921Z"
},
"endTime": "2026-03-16T15:42:17.504730842Z",
"expireTime": "2026-03-17T15:42:17.504731874Z",
"progress": 100,
"done": true,
"response": {
"@type": "[type.googleapis.com/google.cloud.chronicle.v1main.SearchSession](https://type.googleapis.com/google.cloud.chronicle.v1main.SearchSession)",
"name": "projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/searchSessions/SEARCH_SESSION_ID",
"query": "metadata.event_type = \"USER_LOGIN\"",
"timeRange": {},
"startTime": "2026-03-16T14:40:13Z",
"endTime": "2026-03-16T15:40:13Z",
"dialect": "YL2",
"metadata": {
"operationId": "OPERATION_ID",
"startTime": "2026-03-16T15:42:11.037506921Z",
"endTime": "2026-03-16T15:42:17.504730842Z",
"expireTime": "2026-03-17T15:42:17.504731874Z",
"resultRowCount": 10000,
"moreDataAvailable": true
}
}
}
Format nama resource SearchSession adalah
projects/{project}/locations/{location}/instances/{instance}/searchSessions/{search_session}.
Respons yang berhasil berisi kolom kunci berikut:
done: Jika ditetapkan ketrue, operasi akan selesai.state: Jika ditetapkan keSUCCEEDED, penelusuran berhasil diselesaikan.response.name: Nama resourceSearchSession. Gunakan nilai ini sebagai properti induk di langkah berikutnya.response.metadata.resultRowCount: Menunjukkan jumlah total baris yang ditemukan.response.metadata.moreDataAvailable: Menunjukkan bahwa jumlah hasil yang tersedia melebihi batas pengembalian yang ditentukan.
Mencantumkan operasi LRO
Untuk mencantumkan operasi LRO, gunakan metode ListOperations dari layanan google.longrunning.Operations. Gunakan nilai name dari respons sebelumnya.
- Endpoint:
GET /{$api_version}/projects/{project}/locations/{location}/instances/{instance}
Untuk mencantumkan operasi LRO penelusuran dari 24 jam terakhir, tentukan filter name:"operations/s-lro-", termasuk tanda hubung di akhir.
Contoh berikut menunjukkan permintaan ListOperations yang berhasil:
google.longrunning.ListOperationsRequest {
name: "projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID"
filter: "name:\"operations/s-lro-\""
page_size: 100
}
Contoh berikut menunjukkan respons ListOperations yang berhasil:
{
operations {
name: "projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/operations/OPERATION_ID_1"
metadata {
type_url: "[type.googleapis.com/google.cloud.chronicle.v1main.SearchOperation](https://type.googleapis.com/google.cloud.chronicle.v1main.SearchOperation) Metadata"
value: "\b\002\022\f\b\367\304\363\316\006\020\317\352\232\240\003\032\f\b\237\307\363\316\006\020\326\334\351\311\001\"\f\b\237\352\370\316\006\020\352\342\351\311\001(d"
}
done: true
response {
type_url: "[type.googleapis.com/google.cloud.chronicle.v1main.SearchSession](https://type.googleapis.com/google.cloud.chronicle.v1main.SearchSession)"
value: "\n\213\001projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/searchSessions/OPERATION_ID_11022\bip != \"\"\032\020\n\006\b\251\255\334\316\006\022\006\b\351\345\336\316\006\0012\\\n*OPERATION_ID_1\022\f\b\367\304\363\316\006\020\317\352\232\240\003\032\f\b\237\307\363\316\006\020\326\334\351\311\001\"\f\b\237\352\370\316\006\020\352\342\351\311\001(\300\204=0\001"
}
}
operations {
name: "projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/operations/OPERATION_ID_2"
metadata {
type_url: "[type.googleapis.com/google.cloud.chronicle.v1main.SearchOperationMetadata](https://type.googleapis.com/google.cloud.chronicle.v1main.SearchOperationMetadata)"
value: "\b\002\022\f\b\200\305\363\316\006\020\324\262\367\225\001\032\v\b\241\307\363\316\006\020\321\261\333?\"\v\b\241\352\370\316\006\020\317\264\333?(d"
}
done: true
response {
type_url: "[type.googleapis.com/google.cloud.chronicle.v1main.SearchSession](https://type.googleapis.com/google.cloud.chronicle.v1main.SearchSession)"
value: "\n\213\001projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/searchSessions/OPERATION_ID_2\022\bip != \"\"\0321020\n\006\b\251\255\334\316\006\022\006\b\351\345\336\316\006\0012Z\n*OPERATION_ID_2\022\f\b\200\305\363\316\006\0201324\262\367\225\001\032\v\b\241\307\363\316\006\020\321\261\333?\"\v\b\241\352\370\316\006\020\317\264\333?(\300\204=0\001"
}
}
}
Mengambil hasil
Setelah status operasi menampilkan SUCCEEDED, gunakan metode ListSearchedResults()
untuk mengambil hasil penelusuran.
- Endpoint:
GET /{$api_version}/{parent=projects/*/locations/*/instances/*/searchSessions/*}/searchedResults - Metode:
ListSearchedResults - Parameter permintaan:
ListSearchedResultsRequest
Contoh berikut menunjukkan ListSearchedResultsRequest yang mengambil tiga hasil dan melewati lima hasil pertama:
// GET
/v1alpha/projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/searchSessions/SEARCH_SESSION_ID/searchedResults?page_size=3&skip=5
Permintaan ini mendukung parameter kueri berikut:
page_size: Jumlah hasil maksimum yang akan ditampilkan per halaman. Nilai defaultnya adalah 100, dan nilai maksimumnya adalah 10.000.page_token: Token dariListSearchedResultsResponsesebelumnya yang digunakan untuk mengambil halaman berikutnya.order_by(atauorderBydi JSON): Opsional. Kolom yang digunakan untuk mengurutkan hasil. Jika Anda menghilangkanorder_by, hasil peristiwa UDM akan diurutkan berdasarkanudm.metadata.event_timestampdalam urutan menurun secara default, yang menampilkan peristiwa terbaru terlebih dahulu. Jika Anda menentukan jalur kolom diorder_bytanpa akhiran arah, sepertiudm.principal.hostname, hasil akan diurutkan dalam urutan menaik secara default. Jangan menambahkanasc, karena akhiranasctidak didukung dan menampilkan error400 INVALID_ARGUMENT. Untuk mengurutkan hasil dalam urutan menurun, tambahkan akhirandescke jalur kolom, sepertiudm.metadata.event_timestamp desc. Pengurutan multi-kolom tidak didukung.UDM events (eventRecord): Gunakan jalur yang sepenuhnya memenuhi syarat dalam kolomudm, sepertiudm.metadata.event_timestamp descatauudm.principal.hostname. Nama kolom sepertihostname,user,process name, danevent typejuga didukung.Tata urutan default adalah
udm.metadata.event_timestampdalam urutan menurun, yang menampilkan peristiwa terbaru terlebih dahulu.Entities / ECG (entityContextRecord): Gunakan jalur dalam kolomentity, sepertigraph.entity.ipataugraph.entity.ip desc.data tables (dataTableRecord): Gunakan format%<table_alias>.<column_name>. Misalnya,%dt.user desc.Nilai defaultnya adalah kolom tabel data pertama.
Detections (DetectionRecord): Gunakan kata kuncidetectiondiikuti dengan jalur, misalnya,detection.id.Gabungan: Untuk peristiwa dan entity, gunakan variabel placeholder yang menentukannya. Untuk semua sumber lainnya, formatnya tetap sama.
Contoh:
- ECG (gabungan UDM-ECG): Entity:
$e1.graph.entity.hostname - UDM (Semua gabungan dengan UDM):
$e1.principal.ip - Tabel data (Gabungan tabel data UDM):
%<table_alias>.<column_name>
Alias yang telah ditetapkan seperti
hostname,user,process name, danevent typejuga didukung. Untuk ini, gunakan format$e1.hostname.at.- ECG (gabungan UDM-ECG): Entity:
skip: Opsional. Jumlah hasil yang akan dilewati. Jangan gunakan parameter ini denganpage_token.- Pengurutan default (
udm.metadata.event_timestamp) tidak unik di seluruh peristiwa yang memiliki stempel waktu yang sama. Selain itu, tata urutan untuk hasil penelusuran ditetapkan pada panggilanListSearchedResults(searchedResults.list) pertama. - Saat Anda memberi nomor halaman dengan
skip, terutama di seluruh permintaan paralel, tentukan kolom pengurutan unik sepertiudm.metadata.iddalam parameterorder_by. Atau, ambil halaman pertama sebelum mengirim permintaanskipparalel sehingga tata urutan sudah ditetapkan.
- Pengurutan default (
Contoh berikut menunjukkan respons ListSearchedResultsResponse yang berhasil:
{
"searchedResults": [
{
"name":
"projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/searchSessions/SEARCH_SESSION_ID/searchedResults/
RESULT_ID",
"resultRow": {
"eventRecord": {
"event": {
"name":
"projects/PROJECT_NUMBER/locations/LOCATION/instances/INSTANCE_ID/events/EVENT_ID",
"udm": {
"metadata": {
"eventTimestamp": "2026-03-16T14:45:18Z",
"eventType": "USER_LOGIN",
"vendorName": "Microsoft",
"productName": "Azure AD"
}
},
//... other UDM fields
}
//... other UDM fields
"eventLogToken":
"EVENT_LOG_TOKEN"
}
},
{ }
},
{
"name": "projects/PROJECT_NUMBER/locations/
LOCATION/instances/INSTANCE_ID</span>
/searchSessions/SEARCH_SESSION_ID/searchedResults/RESULT_ID", "resultRow": {
"eventRecord": {
//... Similar UDM event structure...
}
}
},
{
""name": "projects/PROJECT_NUMBER/locations/
LOCATION/instances/INSTANCE_ID</span>
/searchSessions/SEARCH_SESSION_ID/searchedResults/RESULT_ID", "resultRow": {
"eventRecord": {
//... Similar UDM event structure...
}
}
}
],
"totalSize": 10000,
"columnNames": [],
"columnSchema": {},
"nextPageToken": "CAKYASAB"
}
Untuk mengambil halaman hasil berikutnya, gunakan nilai nextPageToken yang ditampilkan
dalam parameter kueri page_token dari permintaan ListSearchedResults berikutnya.
Kolom resultRow berisi data aktual.
Lanjutkan memanggil ListSearchedResults dengan nilai next_page_token dari
setiap respons. Jika next_page_token menampilkan hasil kosong, berarti semua hasil telah diambil.
Langkah berikutnya
Untuk mengetahui informasi selengkapnya tentang metode, kolom permintaan dan respons, serta jenis, lihat dokumentasi referensi API berikut:
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.