Bosan Mencari Slack, GitHub, Dan Google Drive Secara Terpisah? Lakukan Semuanya Sekaligus Di SQL – Anda tahu latihannya: Kata-kata yang Anda cari mungkin ada di Slack, atau GitHub, atau Google Drive, atau Google Spreadsheet, atau Zendesk, atau … daftarnya terus berlanjut. Mencari di seluruh silo ini adalah frustrasi umum. Seharusnya tanpa gesekan, dan dasbor Steampipe ini membuatnya demikian.
Bosan Mencari Slack, GitHub, Dan Google Drive Secara Terpisah? Lakukan Semuanya Sekaligus Di SQL

pgsql – Ini bukan rodeo pertama saya. Saya memulai perjalanan ini pada tahun 1996 dan telah meninjau kembali gagasan itu secara berkala. Pada tahun 2018 saya menulis tentang versi yang merupakan contoh klasik dari Hal Paling Sederhana yang Mungkin Berfungsi: halaman web yang mengumpulkan URL pencarian untuk berbagai layanan dan mengunjungi masing-masing di tabnya sendiri. Kedengarannya konyol, itu cukup membantu untuk membiasakan diri sedikit, dan bukan hanya oleh saya.
Tentu saja saya ingin menggunakan API yang mendasarinya, menormalkan hasilnya, dan menggabungkannya ke dalam tampilan umum. Tetapi upaya yang diperlukan untuk memperdebatkan semua API membuat proyek itu lebih bermasalah daripada nilainya. Jika Anda telah melakukan hal semacam ini sebelum Anda tahu bahwa sebagian besar layanan menyediakan API pencarian bersama dengan adaptor untuk bahasa pemrograman pilihan Anda. Tetapi setiap layanan akan memiliki caranya sendiri untuk memanggil API, memberi paginasi hasil, dan memformatnya. Perbedaan tersebut menciptakan gesekan yang perlu Anda atasi agar dapat bekerja dengan hasil secara konsisten.
Baca Juga : Mengenal Fitur Baru dari Postgresql 14
Namun, ketika perdebatan API menjadi tanpa gesekan, banyak hal menjadi mungkin. Metasearch yang efektif adalah salah satunya. Steampipe membuat Anda keluar dari bisnis memanggil API, membuat paginasi hasil, dan membongkar objek JSON. Ini memanggil API untuk Anda dan mengalirkan hasilnya ke tabel database sehingga Anda dapat fokus sepenuhnya untuk bekerja dengan data. Itu memecahkan masalah terbesar yang Anda hadapi saat membangun dasbor metasearch.
Konvergen pada skema
Tantangan berikutnya adalah untuk mengikat hasil pencarian ke skema umum. SQL adalah lingkungan yang bagus untuk melakukan itu. Kueri yang menggerakkan dasbor yang ditampilkan di screencast mencakup tiga bait yang Anda tidak perlu menjadi wizard SQL untuk menulis. Mereka semua mengikuti pola yang sama seperti ini untuk mencari masalah GitHub.
select
‘github_issue’ as type,
repository_full_name || ‘ ‘ || title as source,
to_char(created_at, ‘YYYY-MM-DD’) as date,
html_url as link,
substring(body from 1 for 200) || ‘…’ as content
from
github_search_issue
where
$1 ~ ‘github_issue’
and query = ‘in:body in:comments org:github ‘ || $2
limit $3
Item berwarna biru adalah nama kolom dalam tabel database dalam hal ini github_search_issue, salah satu tabel yang dibuat oleh plugin GitHub Steampipe. Hub Steampipe memudahkan untuk memeriksa nama dan deskripsi kolom dalam tabel, dan menunjukkan kepada Anda contoh cara menggunakan informasi dalam tabel.
Karena mengambil data tidak memerlukan memanggil API dan membongkar JSON, Anda dapat fokus pada sintaks pencarian tingkat tinggi, yang banyak untuk dipikirkan, bersama dengan tantangan yang menarik (dan menyenangkan!) untuk memetakan kolom sumber ke skema umum. Item berwarna merah adalah nama kolom yang muncul di dasbor. Untuk dasbor ini, kami telah memutuskan bahwa setiap hasil penelusuran akan dipetakan ke lima kolom ini: jenis, sumber, tanggal, tautan, dan konten. Klausa AS SQL memudahkan setiap bait untuk mengganti nama kolomnya agar sesuai dengan skema.
Kueri lengkap
Inilah kueri lengkap yang mendorong dasbor. Ada tiga bait seperti di atas, masing-masing ditulis sebagai CTE (common table expression) dengan parameter yang sesuai dengan variabel input. Dan hampir tidak ada yang lain! Setiap bait menanyakan tabel berbasis API (slack_search, github_search_issue, googleworkspace_drive_my_file), memilih (dan mungkin mengubah) kolom, lalu membuat alias hasilnya agar sesuai dengan skema. Yang tersisa hanyalah UNION tiga CTE, yang bertindak seperti tabel sementara, dan mengurutkan hasilnya.
with slack as (
select
‘slack’ as type,
user_name || ‘ in #’ || (channel ->> ‘name’)::text as source,
to_char(timestamp, ‘YYYY-MM-DD’) as date,
permalink as link,
substring(text from 1 for 200) as content
from
slack_search
where
$1 ~ ‘slack’
and query = ‘in:#steampipe after:${local.config.slack_date} ‘ || $2
limit $3
),
github_issue as (
select
‘github_issue’ as type,
repository_full_name || ‘ ‘ || title as source,
to_char(created_at, ‘YYYY-MM-DD’) as date,
html_url as link,
substring(body from 1 for 200) || ‘…’ as content
from
github_search_issue
where
$1 ~ ‘github_issue’
and query = ‘ in:body in:comments org:${local.config.github_org} ‘ || $2
limit $3
),
gdrive as (
select
‘gdrive’ as type,
replace(mime_type,’application/vnd.google-apps.’,”) as source,
to_char(created_time, ‘YYYY-MM-DD’) as date,
‘https://docs.google.com/document/d/’ || id as link,
name as content
from
googleworkspace_drive_my_file
where
$1 ~ ‘gdrive’
and query = ‘fullText contains ‘ || ”” || $2 || ””
limit $3
)
select * from slack
union
select * from github_issue
union
select * from gdrive
order by
date desc
Dasbor sebagai kode
Banyak sistem dasbor dapat bekerja dengan kueri ini. Anda dapat, misalnya, menghubungkan Metabase, atau Tableau, atau klien Postgres lainnya ke Steampipe dan membangun jenis dasbor interaktif yang sama seperti yang ditunjukkan di sini. Anda akan melakukannya bekerja di lingkungan kode rendah di mana widget dan pengaturan ditangani di antarmuka pengguna. Subsistem dasbor Steampipe mengambil pendekatan berbeda yang diinformasikan oleh akar infrastruktur-sebagai-kode (IaC). Kueri terhadap API harus dinyatakan dalam kode SQL yang dikelola, seperti semua kode lainnya, dalam repositori yang dikontrol versi. Widget dasbor yang menampilkan hasil kueri tersebut juga harus diekspresikan dalam kode, dan dalam hal ini bahasanya adalah HCL Terraform.
Inilah definisi HCL dari dasbor metasearch. Ini mendeklarasikan tiga jenis blok input: sources (pilihan ganda), search_term (teks), dan max_per_source (pilihan tunggal, yang merupakan default). Anda dapat melakukan lebih banyak hal dengan blok input—terutama, Anda dapat mengisinya dengan hasil dari kueri SQL, seperti yang ditunjukkan dalam dokumentasi. Itu tidak diperlukan di sini.
Blok tabel menggunakan kueri yang ditentukan di atas, dan mendefinisikan parameter yang diteruskan ke sana. Argumen bungkus memastikan bahwa kolom dengan banyak teks akan dapat dibaca.
dashboard “metasearch” {
input “sources” {
title = “sources”
type = “multiselect”
width = 2
option “slack” {}
option “github_issue” {}
option “gdrive” {}
}
input “search_term” {
type = “text”
width = 2
title = “search term”
}
input “max_per_source” {
title = “max per source”
width = 2
option “2” {}
option “5” {}
option “10” {}
option “20” {}
}
table {
title = “search slack + github + gdrive”
query = query.metasearch
args = [
self.input.sources,
self.input.search_term,
self.input.max_per_source
]
column “source” {
wrap = “all”
}
column “link” {
wrap = “all”
}
column “content” {
wrap = “all”
}
}
}
Sekali lagi tidak banyak yang bisa dilihat di sini, juga seharusnya tidak ada. Membangun dasbor sebagai kode seharusnya tidak memerlukan banyak kode yang rumit, dan memang tidak demikian.
Tidak ada sihir yang diperlukan
Sama seperti Anda tidak perlu menjadi wizard SQL untuk membuat subqueries baru, Anda juga tidak perlu menjadi wizard HCL untuk menambahkannya ke dasbor. Apakah Anda ingin menambahkan sumber? Ada lusinan plugin lain untuk dipilih, dengan lebih banyak yang ditambahkan setiap bulan. Mereka tidak semua menawarkan pencarian tetapi banyak yang melakukannya, dan mudah untuk menemukannya dengan (tentu saja!) kueri Steampipe.
select
name
html_url
from
github_search_code
where
query = ‘search org:turbot org:francois2metz org:ellisvalentiner org:theapsgroup’
and name ~ ‘table’
and name ~ ‘search’
order by
name
Dalam repo sampel steampipe kami telah menyertakan kode untuk dasbor yang ditampilkan di sini, bersama dengan bait pencarian tambahan untuk Zendesk yang kami hapus saat akun uji coba kami kedaluwarsa. Bersenang-senang memperluas dasbor ini!