Memulai dengan snorql
- Apa yang diharapkan dari posting ini?
- Ketahui alat Anda
- Dropwizard
- Kotlin
- Maven - Menyiapkan mesin lokal Anda
- Menyiapkan aplikasi Anda
- Membuat proyek baru
- Menambahkan dependensi
- Bangun & Kompilasi
- Struktur Proyek
- Kode - Bangun & Jalankan Aplikasi
- Langkah selanjutnya
- FAQ
Yah, situasinya juga tidak jauh berbeda di Udaan & saat itulah beberapa dari kami memutuskan untuk mengambil tindakan sendiri dan membuat alat yang akan membantu untuk mengatasi masalah ini terlebih dahulu.
Memasuki …
Apa itu snorql?
snorql adalah proyek sumber terbuka yang dikembangkan di Udaan yang ditujukan untuk memantau & mendiagnosis masalah terkait basis data menggunakan metrik SQL.
Ini memberikan visibilitas tentang kinerja setiap basis data, sehingga Anda dapat berhenti bermain tebak-tebakan dan mulai mengoptimalkan basis data Anda dengan mudah. Dan izinkan saya memberi tahu Anda, visibilitas tambahan ini telah menjadi pengubah permainan bagi organisasi kami. Ini telah meningkatkan akuntabilitas setiap tim.
Hasilnya berbicara sendiri. Berkat snorql,
- Kami telah melihat peningkatan kinerja di 50+ database.
- Mengurangi biaya cloud hingga lebih dari 60%.
- Peningkatan produktivitas pengembang
- Mengurangi waktu debug
Jika pembukaan saya telah menyulut kegembiraan Anda dan Anda sangat ingin memulai, Anda telah datang ke tempat yang tepat. Tetapi jika Anda perlu meyakinkan lebih lanjut, pastikan untuk membaca artikel fantastis berjudul snorql — mendiagnosis database seperti bos .
Apa yang diharapkan dari posting ini?
Snorql memaparkan beberapa metrik seperti Kueri Aktif, Kueri yang Diblokir, Statistik Indeks, Pertumbuhan Basis Data, dll… daftar lengkapnya di sini . Untuk posting ini, kami akan mengambil Kueri Aktif. Kueri Aktif adalah alat berharga bagi pengguna SQL Server yang perlu memantau dan mengoptimalkan kinerja kueri mereka secara real-time.
Dalam posting ini, saya akan menunjukkan kepada Anda bagaimana mengintegrasikan snorqlke dalam aplikasi Dropwizard Kotlin sederhana ( Anda juga dapat mereplikasi hal yang sama di Framework Java lainnya ). Di akhir tutorial ini, aplikasi Anda akan memaparkan RESTful API yang dengannya Anda dapat mengetahui statistik kueri langsung untuk database apa pun yang diberikan.
Ketahui alat Anda
Bagi yang sudah terbiasa dengan Kotlin, Dropwizard, dan Maven, silakan lewati bagian ini.
Dropwizard
Dropwizard adalah framework Java ringan untuk membangun layanan web RESTful. Dropwizard mengumpulkan pustaka yang stabil, seperti Jersey, Jackson, dan JDBI, ke dalam paket yang ringan. Untuk lebih jelasnya kunjungihttps://www.dropwizard.io/en/latest/.
Fakta menyenangkan: Dropwizard terinspirasi oleh Ruby on Rails, framework aplikasi web populer dalam bahasa pemrograman Ruby. Pembuat Dropwizard ingin menghadirkan tingkat produktivitas dan kemudahan penggunaan yang sama ke ekosistem Java.
Kotlin
Kotlin adalah bahasa pemrograman yang mendukung pemrograman fungsional dan berorientasi objek yang dibuat oleh JetBrains, sebuah perusahaan pengembangan perangkat lunak yang berbasis di Rusia. Sintaks dan konsep Kotlin mirip dengan C#, Scala, dan Java. Untuk lebih jelasnya kunjungihttps://kotlinlang.org/
Salah satu fakta menarik tentang Kotlin adalah bahwa namanya sebenarnya berasal dari sebuah pulau di dekat St. Petersburg, Rusia, yang disebut Pulau Kotlin. Pencipta Kotlin memilih nama ini karena banyak dari mereka yang tinggal di atau sekitar St. Petersburg dan pulau tersebut merupakan landmark terkenal di daerah tersebut.
Maven
Maven adalah alat otomatisasi dan manajemen build untuk Java. Dengan Maven, mudah untuk menentukan pembangunan perangkat lunak dan ketergantungannya.
Fakta menyenangkan: Maven diciptakan oleh Jason van Zyl pada tahun 2002 saat dia sedang menunggu penerbangan di Bandara O'Hare Chicago.
Menyiapkan mesin lokal Anda
Anda akan menemukan banyak artikel & video YouTube yang sama, namun, saya telah melampirkan beberapa referensi cepat
- Menginstal & Menyiapkan maven —https://www.freecodecamp.org/news/how-to-get-started-with-maven-36851d8cfd96/
- Memasang Kotlin —https://www.oreilly.com/library/view/kotlin-cookbook/9781492046660/ch01.html
- Menginstal IntelliJ —https://www.jetbrains.com/help/idea/installation-guide.html
Bagian ini menganggap Anda telah menyiapkan Maven, Kotlin & IntelliJ (atau IDE lainnya dengan dukungan untuk proyek maven).
Membuat proyek baru
- Klik File -> Baru -> Proyek -> Maven. Anda akan melihat popup berikut
3. IDE Anda akan membuka file pom.xml dengan proyek yang memiliki struktur berikut.
Menambahkan dependensi
Sebelum memulai implementasi, kita perlu menambahkan dependensi khusus yang diperlukan untuk proyek di dalam pom.xmlfile. Mari lakukan bersama.
Kita mulai dengan mendefinisikan versi Kotlin & Dropwizard di tag properti.
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<kotlin.version>1.4.10</kotlin.version>
<kotlin.compiler.languageVersion>1.4</kotlin.compiler.languageVersion>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
<dropwizard.version>2.0.13</dropwizard.version>
</properties>
<dependencies>
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<version>${dropwizard.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
jdbi3
Kami akan membutuhkan dependensi ini untuk membuat koneksi ke database. Saya menggunakan jdbi3 di sini. Ini akan berfungsi dengan semua versi JDBC/JDBI.
Properti:
<jdbi.version>3.37.1</jdbi.version>
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-core</artifactId>
<version>${jdbi.version}</version>
</dependency>
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-sqlobject</artifactId>
<version>${jdbi.version}</version>
</dependency>
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-kotlin-sqlobject</artifactId>
<version>${jdbi.version}</version>
</dependency>
Kami perlu menambahkan ini agar aplikasi dapat berhasil terhubung ke database server SQL. Menghilangkan ini akan memberi Anda java.sql.SQLException: No suitable driver foundpengecualian yang terkenal. Di sini, saya akan menggunakan snorql-extensionsmodul yang memberi kita metrik yang telah ditentukan sebelumnya yang sesuai dengan SQL server, maka kita akan menggunakan driver ini.
Ada modul lain, snorql-frameworkyang merupakan kerangka dasar dari alat yang mendasarinya. Saya akan menjelajahinya dalam artikel yang akan datang di mana kita akan mengetahui cara memanfaatkan framework ini untuk berbagai database seperti Postgres, MySQL, dll…
Properti:
<mssql.version>9.2.1.jre8</mssql.version>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${mssql.version}</version>
</dependency>
Yah, tidak bisa menghilangkan ini!
Properti:
<snorql.version>0.5.6</snorql.version>
<dependency>
<groupId>com.udaan.snorql</groupId>
<artifactId>snorql-extensions</artifactId>
<version>${snorql.version}</version>
</dependency>
Bangun & Kompilasi
Langkah selanjutnya adalah menentukan direktori sumber in <sourceDirectory>dan in <testSourceDirectory>untuk mengkompilasi kode sumber. Kami juga akan mengonfigurasi plugin Kotlin yang diperlukan untuk mengompilasi kode sumber kami.
Tambahkan kode pom.xmlseperti yang ditunjukkan setelah bagian dependensi
<dependencies>
.....
</dependencies>
<build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Segera setelah Anda melakukan ini, Anda akan melihat kotlin disorot dengan warna merah. Ini karena jalurnya belum ada sampai sekarang, yang membawa kita ke bagian berikutnya → struktur proyek
Struktur Proyek
Ini adalah struktur proyek saya. Anda dapat menggunakan yang sama untuk memulai & kemudian menyesuaikan sesuai dengan kebutuhan Anda.
Kode
Langkah 1: Kita mulai dengan membuat config.ymlfile di dalam src/main/resources. Kita dapat menentukan parameter dalam file konfigurasi ini yang akan dideserialisasikan ke instance kelas konfigurasi kita. Kita perlu menambahkan setidaknya satu parameter, jika tidak kerangka kerja Dropwizard akan membuat kesalahan selama kompilasi. Mari lanjutkan & tambahkan ini:
environment: local
package com.hawkeye.configuration
import com.fasterxml.jackson.annotation.JsonProperty
import io.dropwizard.Configuration
class AppConfig(@JsonProperty("environment") val environment: String): Configuration()
Langkah 4: Selanjutnya, kita buat BootstrapSnorqlApplicationfile .kt di dalam path src/main/kotlin/com/hawkeye& tambahkan kode berikut:
package com.hawkeye.core
import org.jdbi.v3.core.Jdbi
import org.jdbi.v3.core.kotlin.KotlinPlugin
import org.jdbi.v3.sqlobject.SqlObjectPlugin
import org.jdbi.v3.sqlobject.kotlin.KotlinSqlObjectPlugin
class JdbiFactory {
/**
* Return instance of JDBI with all plugins installed
* @param dbName Name of the DB to connect
*/
fun getInstance(dbName: String): Jdbi {
return Jdbi.create(getConnectionStringByDatabaseName(dbName))
.installPlugin(SqlObjectPlugin())
.installPlugin(KotlinPlugin())
.installPlugin(KotlinSqlObjectPlugin())
}
private fun getConnectionStringByDatabaseName(dbName: String): String {
return when(dbName) {
"db-prod" -> "jdbc:sqlserver://<server-name>:<port>;database=$dbName;user=<username>;password=<pwd>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
else -> ""
}
}
}
Langkah 5: Sekarang kita perlu mengimplementasikan Connectionantarmuka yang snorql-frameworkterbuka. Sebut saja SqlServerConnection& itu akan menyimpan metode yang diperlukan untuk snorqlberinteraksi dengan database pengguna. Untuk posting ini menerapkan run()metode saja sudah cukup. Kami akan mengeksplorasi yang lain dalam posting blog terperinci yang terpisah.
Buat SqlServerConnection.ktfile di jalur src/main/kotlin/com/hawkeye/core& tambahkan kode di bawah ini.
package com.hawkeye.core
import com.udaan.snorql.framework.metric.Connection
import com.udaan.snorql.framework.models.HistoricalDatabaseResult
import javax.inject.Inject
class SqlServerConnection @Inject constructor(private val jdbi3Factory: JdbiFactory) : Connection {
override fun <T> run(databaseName:String, query: String, mapClass: Class<T>,params: Map<String, *>): List<T> {
return if(params.isNotEmpty()){
jdbi3Factory.getInstance(databaseName).withHandle<List<T>, Exception> { handle ->
handle.createQuery(query).bindMap(params).mapTo(mapClass).toList()
}
} else{
jdbi3Factory.getInstance(databaseName).withHandle<List<T>, Exception> { handle ->
handle.createQuery(query).mapTo(mapClass).toList() as List<T>
}
}
}
override fun storeData(storageBucketId: String, columns: List<String>, rows: List<List<Any>>) {
TODO("Not yet implemented")
}
override fun getHistoricalData(
storageBucketId: String,
metricId: String,
databaseName: String,
columns: List<String>,
paginationParams: Map<String, *>,
params: Map<String, *>
): HistoricalDatabaseResult {
TODO("Not yet implemented")
}
}
snorql memaparkan banyak metrik SQL berguna yang dapat diintegrasikan & digunakan dengan aplikasi Anda. Untuk posting ini, kami akan memilih metrik yang paling relevan bagi siapa saja yang pernah menggunakan database — Active Queries.
Kueri Aktif, juga dikenal sebagai statistik kueri langsung, adalah fitur di SQL Server yang memungkinkan pengguna memantau kemajuan kueri mereka secara real time. Ini memberikan informasi tentang status kueri, seperti persentase penyelesaian, waktu yang berlalu, dan perkiraan sisa waktu, serta rencana eksekusi yang digunakan oleh SQL Server untuk memproses kueri.
Untuk itu, buat SnorqlMetricsResource.ktfile di dalamnya src/main/kotlin/com/hawkeye/resources& tambahkan kode di bawah ini.
package com.hawkeye.resources
import com.fasterxml.jackson.annotation.JsonProperty
import com.udaan.snorql.extensions.performance.PerformanceEnums
import com.udaan.snorql.extensions.performance.models.ActiveQueryInput
import com.udaan.snorql.extensions.performance.models.ActiveQueryResult
import com.udaan.snorql.framework.metric.SqlMetricManager
import com.udaan.snorql.framework.models.IMetricRecommendation
import com.udaan.snorql.framework.models.MetricPeriod
import javax.ws.rs.Consumes
import javax.ws.rs.POST
import javax.ws.rs.Path
import javax.ws.rs.Produces
import javax.ws.rs.container.AsyncResponse
import javax.ws.rs.container.Suspended
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.Response
@Path("/snorql")
class SnorqlMetricsResource {
/*
* Fetches list of active-queries metric for a [activeQueryMetricInput]
*/
@POST
@Path("activeQueries")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
fun getActiveQueryMetric(
input: Input,
@Suspended asyncResponse: AsyncResponse
) {
val activeQueryInput = ActiveQueryInput(
databaseName = input.databaseName,
metricPeriod = input.metricPeriod,
metricId = input.metricId
)
try {
val response = SqlMetricManager.getMetric<ActiveQueryInput, ActiveQueryResult, IMetricRecommendation>(
PerformanceEnums.ACTIVE_QUERIES.getId(),
activeQueryInput
)
asyncResponse.resume(Response.ok(response).build())
} catch (e: Exception) {
println("Something went wrong. Error : ${e.message as String}")
Response.status(500).entity(e.message as String).build()
}
}
}
data class Input (
@JsonProperty("metricId")
val metricId: String = PerformanceEnums.ACTIVE_QUERIES.getId(),
@JsonProperty("metricPeriod")
val metricPeriod: MetricPeriod,
@JsonProperty("databaseName")
val databaseName: String
)
package com.hawkeye
import com.google.inject.AbstractModule
import com.google.inject.Guice
import com.hawkeye.configuration.AppConfig
import com.hawkeye.core.SqlServerConnection
import com.hawkeye.resources.SnorqlMetricsResource
import com.udaan.snorql.extensions.SQLCommonMetrics
import com.udaan.snorql.framework.metric.SqlMetricManager
import io.dropwizard.Application
import io.dropwizard.setup.Environment
class HawkeyeApplication: Application<AppConfig>() {
companion object {
@JvmStatic fun main(args: Array<String>) = HawkeyeApplication().run(*args)
}
override fun run(appConfig: AppConfig, environment: Environment) {
environment.jersey().register(SnorqlMetricsResource::class.java)
registerSQLMetrics()
}
private fun registerSQLMetrics() {
val sqlServerConnectionInstance =
Guice.createInjector(SqlClientModule()).getInstance(SqlServerConnection::class.java)
SqlMetricManager.setConnection(sqlServerConnectionInstance)
SQLCommonMetrics.initialize()
}
}
class SqlClientModule : AbstractModule()
Bangun & Jalankan Aplikasi
Kami siap untuk menjalankan kamiHawkeyeApplication
Untuk melakukan itu tambahkan konfigurasi seperti yang ditunjukkan di bawah ini:
Perhatikan bahwa kami telah menambahkan server src/main/resources/config.ymlargumen program. Ini memberi tahu aplikasi Dropwizard untuk dijalankan sebagai server dan melawan lokasi file konfigurasi yang disediakan.
Jika semuanya berjalan dengan baik, Anda akan melihat sesuatu seperti ini di terminal. Jika tidak & Anda diteriaki dengan beberapa kesalahan, jangan khawatir, saya juga membantu Anda. Buka bagian FAQ & periksa kesalahan/resolusi yang saya hadapi.
Buka Postman atau alat serupa lainnya & uji API. Klik Impor -> Teks mentah -> Salin tempel panggilan keriting yang diberikan di bawah -> Klik Lanjutkan -> Klik Kirim
curl --location --request POST 'localhost:8080/snorql/activeQueries' \
--header 'Content-Type: application/json' \
--data-raw '{
"databaseName": "db-prod",
"metricId": "performance_activeQueries",
"metricPeriod": "REAL_TIME",
"recommendationRequired": true
}'
Di sini, kami telah menanyakan untuk melihat semua kueri aktif untuk database db-prod. Respon dibagi menjadi 3 bagian:
metricInput
Ini mengembalikan masukan yang diberikan oleh pengguna dengan nilai default di bidang opsional.
"metricInput": {
"from": null,
"to": null,
"recommendationRequired": false,
"metricId": "performance_activeQueries",
"metricPeriod": "REAL_TIME",
"databaseName": "db-prod"
}
Ini memberi Anda daftar kueri yang sedang berjalan saat ini di database Anda bersama dengan semua parameter relevan yang terkait dengannya. Ini dapat berguna dalam skenario berikut:
- Ketika Anda mencoba untuk men-debug latensi yang meningkat pada database Anda & Anda ingin memeriksa apakah ada kueri yang berjalan lama yang telah memonopoli CPU Anda dengan melihat
elapsedTime. Kueri yang berjalan lama ini dapat disebabkan oleh berbagai masalah, seperti rencana kueri yang tidak efisien, pengindeksan yang kurang optimal, atau kueri yang ditulis dengan buruk. Selain itu, kami juga dapat menggunakan ini untuk menganalisis distribusi waktu eksekusi kueri di seluruh database dan mengambil langkah proaktif untuk mencegah masalah sebelum terjadi. - Ketika Anda berada dalam keadaan di mana database terlihat hang atau proses tidak berjalan, memeriksa pemblokiran database sangat masuk akal & Anda dapat mengetahui sessionId yang tepat memblokir kueri ini dengan bantuan
blockedBy. - Parameter ini
openTransactionCountdigunakan untuk memantau jumlah transaksi yang terbuka di database pada waktu tertentu. Jika hitungan ini tinggi secara konsisten, ini mungkin menunjukkan bahwa ada transaksi yang tidak dilakukan atau dibatalkan tepat waktu. Hal ini dapat menyebabkan masalah seperti pertentangan sumber daya, peningkatan penguncian, dan kebuntuan, yang dapat berdampak negatif terhadap kinerja dan ketersediaan database. Dengan menggunakanopenTransactionCountparameter bersama dengan metrik kinerja lainnya, seperti waktu eksekusi kueri dan waktu tunggu kueri, kami dapat mengidentifikasi kueri yang memerlukan perhatian kami dengan benar.
"metricOutput": {
"result": {
"queryList": [
{
"sessionId": 627,
"status": "running",
"blockedBy": 0,
"waitType": null,
"waitResource": "",
"percentComplete": 0,
"waitTime": "00:00:00",
"cpuTime": 2,
"logicalReads": 19,
"reads": 0,
"writes": 0,
"elapsedTime": "0d 00:00:00",
"queryText": "<?query -- \\n\\nSELECT DISTINCT ffi.shipment_group_id, so.extra_data, so.order_type, cac.amount_in_paisa as consumed_amount_in_paisa FROM fulfillment_line_items ffi JOIN seller_order_line ol on ol.order_line_id = ffi.order_line_id JOIN seller_order so on so.order_id = ol.seller_order_id LEFT OUTER JOIN collected_advance_consumable cac on cac.consumed_for = ffi.shipment_group_id WHERE ffi.shipment_group_id in (@P0)\\n\\n--?>",
"storedProc": "",
"command": "SELECT",
"loginName": "udaan",
"hostName": "order-processing-daemons-6fdfb74677-86xtx",
"programName": "order-processing-daemons-6fdfb74677-86xtx/order-mgmt",
"hostProcessId": 0,
"lastRequestEndTime": "2023-02-24 10:36:18.283",
"loginTime": "2023-02-24 10:32:52.12",
"openTransactionCount": 0
}
]
},
"recommendation": null
}
Bagian ini memberi kami detail tentang kueri yang digunakan oleh snorql untuk menghasilkan keluaran di atas. Ini juga dilengkapi dengan deskripsi singkat & referensi cepat ke dokumentasi resmi Microsoft.
& adalah bagian dari fitur di mana snorql membantu kami merekam & menyimpan kumpulan hasil dari keluaran kueri pada interval tertentu yang memungkinkan kami untuk meninjau kembali data sebelumnya supportsHistorical. minimumRepeatIntervalIni akan membantu dalam postmortem, masalah triase & menemukan anomali. Fitur ini memerlukan pos terperinci tersendiri.
"metadata": {
"underlyingQueries": [
"SELECT sessionId=s.session_id\\n ,status=r.STATUS\\n ,blockedBy=r.blocking_session_id\\n ,waitType=r.wait_type\\n, waitResource=r.wait_resource\\n, waitTime=CONVERT(VARCHAR, DATEADD(ms, r.wait_time, 0), 8)\\n, cpuTime=r.cpu_time\\n, logicalReads=r.logical_reads\\n, r.reads\\n ,r.writes,\\n r.percent_complete as percentComplete\\n,elapsedTime=CONVERT(varchar, (r.total_elapsed_time/1000 / 86400))+ 'd ' +\\n CONVERT(VARCHAR, DATEADD(ms, r.total_elapsed_time, 0), 8)\\n ,queryText=CAST((\\n '<?query -- ' + CHAR(13) + CHAR(13) + Substring(st.TEXT, (r.statement_start_offset / 2) + 1, (\\n (\\n CASE r.statement_end_offset\\n WHEN - 1\\n THEN Datalength(st.TEXT)\\n ELSE r.statement_end_offset\\n END - r.statement_start_offset\\n) / 2\\n) + 1) + CHAR(13) + CHAR(13) + '--?>'\\n ) AS XML)\\n, storedProc=COALESCE(\\n QUOTENAME(DB_NAME(st.dbid)) + N'.' + \\n QUOTENAME(OBJECT_SCHEMA_NAME(st.objectid, st.dbid)) + N'.' +\\n QUOTENAME(OBJECT_NAME(st.objectid, st.dbid)), ''\\n)\\n --,qp.query_plan AS 'xml_plan' -- uncomment (1) if you want to see plan\\n, r.command\\n ,loginName=s.login_name\\n ,hostName=s.host_name\\n ,programName=s.program_name\\n ,hostProcessId=s.host_process_id\\n ,lastRequestEndTime=s.last_request_end_time\\n ,loginTime=s.login_time\\n ,openTransactionCount=r.open_transaction_count\\n FROM sys.dm_exec_sessions AS s\\n INNER JOIN sys.dm_exec_requests AS r ON r.session_id = s.session_id\\n CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st\\n --OUTER APPLY sys.dm_exec_query_plan(r.plan_handle) AS qp -- uncomment (2) if you want to see plan \\n ORDER BY r.blocking_session_id"
],
"referenceDocumentation": [],
"description": "",
"supportsHistorical": true,
"minimumRepeatInterval": "10"
}
Jika Anda ingin memeriksa seluruh kode, kunjungi di sini dihttps://github.com/lakshmi-udaan/hawkeye
Langkah selanjutnya
Apa yang kita lakukan?
Setelah mendapatkan data yang diperlukan, kami berangkat untuk membuat alat visualisasi yang kuat. Untuk tujuan ini, kami menambah API dengan lapisan UI yang mudah digunakan dan menghasilkan Dasbor SQL, yang memberikan pandangan mata burung yang komprehensif dari semua database dan tampilan detail dan granular dari masing-masing database. Pengembang organisasi kami sangat mengandalkannya untuk tugas terkait SQL. Sayangnya, saat ini bukan open-source, tetapi jika Anda tertarik, saya senang untuk berdiskusi lebih lanjut. Ini adalah puncak yang sama.
Apa yang dapat Anda lakukan?
Sekarang Anda tahu cara menggunakan snorql, hanya masalah waktu sebelum Anda membuka potensi penuhnya & mulai meningkatkan kinerja database Anda secara eksponensial.
Anda dapat menemukan daftar semua metrik yang tersedia di sini . Anda bisa mendapatkan metrik ini hanya dengan mengubah parameter yang diteruskan di dalam SqlMetricManager.getMetric()seperti yang kami lakukan saat membuat titik akhir API untuk Kueri Aktif di sini .
Di posting saya berikutnya, kita akan mendalami bagaimana kita dapat menggunakan beberapa metrik ini untuk meningkatkan produktivitas database Anda hingga 10x.
Terima kasih sudah membaca!
FAQ
- Tidak dapat menemukan artefak com.udaan.snorql:snorql-framework:pom:0.5.6 di xyz
Solusi: Lakukanmvn clean install. Ini akan membersihkan apa pun yang dibuat dari build sebelumnya, lalu bangun proyek Anda dan tambahkan toples ke repositori maven lokal Anda (.m2\repository) - Jika Anda diminta dengan kesalahan ini Solusi: Anda harus memuat file . Anda melewatkan penambahan
java.sql.SQLException: No suitable driver foundjdbc drivermssql-jdbc
https://udaan-com.github.io/snorql/
https:///engineering-udaan/snorql-diagnosing-databases-like-a-boss-54f2e8fbf57a

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































