snorql'e başlarken
- Bu yazıdan ne beklenir?
- Araçlarınızı bilin
- Dropwizard
- Kotlin
- Maven - Yerel makinenizi kurma
- Uygulamanızı ayarlama
- Yeni bir proje oluşturma
- Bağımlılıklar ekleme
- Oluştur ve Derle
- Proje Yapısı
- Kod - Uygulamayı Oluşturun ve Çalıştırın
- Sonraki adımlar
- SSS
Eh, durum Udaan'da da o kadar farklı değildi ve o zaman bazılarımız meseleleri kendi elimize almaya ve bu problemlerin önceden üstesinden gelmeye yardımcı olacak bir araç yaratmaya karar verdik.
Girmek …
snorql nedir?
snorql, Udaan'da SQL ölçümlerini kullanarak veritabanıyla ilgili sorunları izlemeyi ve teşhis etmeyi amaçlayan açık kaynaklı bir projedir.
Her veritabanının nasıl performans gösterdiğine dair görünürlük sağlar, böylece tahmin oyununu oynamayı bırakıp veritabanlarınızı kolaylıkla optimize etmeye başlayabilirsiniz. Ve size şunu söyleyeyim, bu ek görünürlük organizasyonumuz için oyunun kurallarını değiştirdi. Her takımın hesap verebilirliğini artırdı.
Sonuçlar kendileri için konuşur. snorql sayesinde,
- 50'den fazla veritabanında performansın arttığını gördük.
- Bulut maliyetlerini %60'tan fazla azalttı.
- Artan geliştirici üretkenliği
- Azaltılmış hata ayıklama süresi
Önsözüm heyecanınızı ateşlediyse ve başlamak için can atıyorsanız, doğru yere geldiniz. Ancak daha fazla ikna etmeye ihtiyacınız olursa, snorql — veritabanlarını bir patron gibi teşhis etmek başlıklı harika makaleye göz atmayı unutmayın .
Bu yazıdan ne beklenir?
Snorql, Aktif Sorgular, Engellenen Sorgular, Dizin İstatistikleri, Veritabanı Büyümesi vb. gibi çoklu ölçümleri ortaya çıkarır… tam liste burada . Bu gönderi için Aktif Sorguları toplayacağız. Aktif Sorgular, sorgularının performansını gerçek zamanlı olarak izlemesi ve optimize etmesi gereken SQL Server kullanıcıları için değerli bir araçtır.
snorqlBu gönderide size basit bir Kotlin Dropwizard uygulamasına nasıl entegre edileceğini göstereceğim ( Aynısını herhangi bir Java Framework'te de çoğaltabilirsiniz ). Bu eğitimin sonunda, uygulamanız herhangi bir veri tabanı için canlı sorgu istatistiklerini bulabileceğiniz RESTful API'yi kullanıma sunacaktır.
Araçlarınızı tanıyın
Kotlin, Dropwizard ve Maven'e zaten aşina olanlar için bu bölümü atlamaktan çekinmeyin.
Dropwizard
Dropwizard, RESTful web hizmetleri oluşturmak için hafif bir Java çerçevesidir. Dropwizard, Jersey, Jackson ve JDBI gibi kararlı kitaplıkları hafif bir pakette toplar. Daha fazla ayrıntı için ziyaret edinhttps://www.dropwizard.io/en/latest/.
Eğlenceli gerçek: Dropwizard, Ruby programlama dilinde popüler bir web uygulama çerçevesi olan Ruby on Rails'den esinlenmiştir. Dropwizard'ın yaratıcıları, aynı düzeyde üretkenliği ve kullanım kolaylığını Java ekosistemine getirmek istediler.
Kotlin
Kotlin, Rusya merkezli bir yazılım geliştirme şirketi olan JetBrains tarafından oluşturulan, işlevsel ve nesne yönelimli programlamayı destekleyen bir programlama dilidir. Kotlin'in sözdizimi ve kavramları C#, Scala ve Java'ya benzer. Daha fazla ayrıntı için ziyaret edinhttps://kotlinlang.org/
Kotlin hakkında eğlenceli bir gerçek, adının aslında Rusya'nın St. Petersburg yakınlarındaki Kotlin Adası adlı bir adadan türetilmiş olmasıdır. Kotlin'in yaratıcıları bu adı seçti çünkü birçoğu St. Petersburg'da veya çevresinde yaşıyor ve ada bölgede iyi bilinen bir simge yapı.
Uzman
Maven, Java için bir yapı otomasyonu ve yönetim aracıdır. Maven ile yazılımın yapısını ve bağımlılıklarını tanımlamak kolaydır.
Eğlenceli gerçek: Maven, Jason van Zyl tarafından 2002 yılında Chicago O'Hare Havaalanında bir uçuş beklerken yaratıldı.
Yerel makinenizi kurma
Bununla ilgili birçok makale ve YouTube videosu bulacaksınız, ancak bazı hızlı referanslar ekledim.
- maven'i Kurma ve Ayarlama —https://www.freecodecamp.org/news/how-to-get-started-with-maven-36851d8cfd96/
- Kotlin'i Kurmak —https://www.oreilly.com/library/view/kotlin-cookbook/9781492046660/ch01.html
- IntelliJ'i yükleme —https://www.jetbrains.com/help/idea/installation-guide.html
Bu bölüm, Maven, Kotlin & IntelliJ'i (veya maven projelerini destekleyen başka bir IDE'yi) zaten kurmuş olduğunuzu varsayar.
Yeni bir proje oluşturma
- Dosya -> Yeni -> Proje -> Maven'e tıklayın. Aşağıdaki açılır pencereyi göreceksiniz
3. IDE'niz pom.xml dosyasını aşağıdaki yapıya sahip proje ile açacaktır.
Bağımlılıklar ekleme
Uygulamaya başlamadan önce, proje için gerekli olan belirli bağımlılıkları dosyaya eklememiz gerekiyor pom.xml. Hadi beraber yapalım.
Properties etiketinde Kotlin & Dropwizard sürümlerini tanımlayarak başlıyoruz.
<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
Veritabanına bağlantı yapmak için bu bağımlılığa ihtiyacımız olacak. Burada jdbi3 kullanıyorum. Bu, herhangi bir JDBC/JDBI sürümüyle çalışacaktır.
Özellikler:
<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>
Uygulamanın SQL server veritabanına başarılı bir şekilde bağlanabilmesi için bunu eklememiz gerekecek. Bunu atlamak size kötü şöhretli istisnayı verecektir java.sql.SQLException: No suitable driver found. Burada, bize SQL sunucusuna karşılık gelen önceden tanımlanmış metrikleri veren modülü kullanacağım snorql-extensions, dolayısıyla bu sürücü ile gidiyoruz.
snorql-frameworkAltta yatan aracın temel çerçevesi olan başka bir modül vardır . Bunu, Postgres, MySQL, vb. gibi farklı veritabanları için bu çerçeveden nasıl yararlanacağımızı bileceğimiz gelecek bir makalede keşfedeceğim…
Özellikler:
<mssql.version>9.2.1.jre8</mssql.version>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${mssql.version}</version>
</dependency>
Peki, bunu atlayamam!
Özellikler:
<snorql.version>0.5.6</snorql.version>
<dependency>
<groupId>com.udaan.snorql</groupId>
<artifactId>snorql-extensions</artifactId>
<version>${snorql.version}</version>
</dependency>
Oluştur ve Derle
Bir sonraki adım, kaynak kodunu derlemek için in <sourceDirectory>ve in kaynak dizinlerini belirtmektir . <testSourceDirectory>Ayrıca kaynak kodumuzu derlemek için gerekli olan Kotlin eklentisini de yapılandıracağız.
pom.xmlBağımlılıklar bölümünden sonra gösterildiği gibi kodu ekleyin
<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>
Bunu yapar yapmaz kotlin'in kırmızıyla vurgulandığını göreceksiniz. Bunun nedeni, yolun şu an mevcut olmamasıdır, bu da bizi bir sonraki bölüme → proje yapısına getirir.
Proje Yapısı
Bu benim proje yapımız. Başlamak için aynısını kullanabilir ve daha sonra ihtiyacınıza göre özelleştirebilirsiniz.
kod
Adım 1:config.yml İçinde bir dosya oluşturarak başlıyoruz src/main/resources. Bu yapılandırma dosyasında, yapılandırma sınıfımızın bir örneğine seri hale getirilecek parametreleri tanımlayabiliriz. En az bir parametre eklememiz gerekiyor, aksi takdirde Dropwizard çerçevesi derleme sırasında bir hata atar. Devam edelim ve şunu ekleyelim:
environment: local
package com.hawkeye.configuration
import com.fasterxml.jackson.annotation.JsonProperty
import io.dropwizard.Configuration
class AppConfig(@JsonProperty("environment") val environment: String): Configuration()
Adım 4:BootstrapSnorqlApplication Ardından, yolun içinde .kt dosyası oluşturuyoruz src/main/kotlin/com/hawkeyeve aşağıdaki kodu ekliyoruz:
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 -> ""
}
}
}
Adım 5:Connection Şimdi ortaya çıkan arayüzü uygulamamız gerekiyor snorql-framework. Hadi onu arayalım ve kullanıcının veri tabanıyla etkileşime geçmek SqlServerConnectioniçin gerekli yöntemleri tutacaktır . snorqlBu gönderi için run()tek başına yöntemi uygulamak yeterli olacaktır. Diğerlerini ayrı bir ayrıntılı blog gönderisinde inceleyeceğiz.
SqlServerConnection.ktYolda bir dosya oluşturun src/main/kotlin/com/hawkeye/coreve aşağıdaki kodu ekleyin.
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, uygulamanızla entegre edilebilecek ve kullanılabilecek birçok kullanışlı SQL metriğini ortaya çıkarır. Bu gönderi için, şimdiye kadar bir veritabanı kullanmış olan herkes için en alakalı olacak metriği seçeceğiz - Active Queries.
Canlı sorgu istatistikleri olarak da bilinen Etkin Sorgular, kullanıcıların sorgularının ilerlemesini gerçek zamanlı olarak izlemelerine olanak tanıyan bir SQL Server özelliğidir. SQL Server tarafından sorguyu işlemek için kullanılan yürütme planının yanı sıra tamamlanma yüzdesi, geçen süre ve tahmini kalan süre gibi bir sorgunun durumu hakkında bilgi sağlar.
Bunun için SnorqlMetricsResource.ktiçinde bir dosya oluşturun src/main/kotlin/com/hawkeye/resourcesve aşağıdaki kodu ekleyin.
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()
Uygulamayı Oluşturun ve Çalıştırın
bizim çalıştırmak için hazırızHawkeyeApplication
Bunu yapmak için yapılandırmayı aşağıda gösterildiği gibi ekleyin:
server src/main/resources/config.ymlProgram bağımsız değişkenlerini eklediğimize dikkat edin . Bu, Dropwizard uygulamasının bir sunucu olarak ve sağlanan yapılandırma dosyasının konumuna göre çalışmasını söyler.
Her şey yolunda giderse, terminalde böyle bir şey görmelisiniz. Değilse ve bazı hatalarla size bağırılırsa, endişelenmeyin, sizi bunun için de koruyacağım. SSS bölümüne gidin ve karşılaştığım hataları/çözümleri kontrol edin.
Postman'a veya başka bir benzer araca gidin ve API'yi test edin. İçe Aktar -> Ham metin -> Kopyala aşağıda verilen curl çağrısını yapıştırın -> Devam'a tıklayın -> Gönder'e tıklayın
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
}'
Burada, veritabanı için tüm aktif sorguları görmek için sorguladık db-prod. Yanıt 3 bölüme ayrılmıştır:
metrik Girdi
Bu, isteğe bağlı alanlarda kullanıcı tarafından sağlanan girişi varsayılan değerlerle döndürür.
"metricInput": {
"from": null,
"to": null,
"recommendationRequired": false,
"metricId": "performance_activeQueries",
"metricPeriod": "REAL_TIME",
"databaseName": "db-prod"
}
Bu, veritabanınızda şu anda çalışan sorguların listesini ve bunlarla ilişkili tüm ilgili parametreleri verir. Bu, aşağıdaki senaryolarda yararlı olabilir:
- Veritabanınızdaki artan gecikmede hata ayıklamaya çalıştığınızda ve CPU'nuzu meşgul eden uzun süredir devam eden sorgular olup olmadığını kontrol etmek istediğinizde
elapsedTime. Bu uzun süredir devam eden sorgular, verimsiz sorgu planları, yetersiz dizin oluşturma veya kötü yazılmış sorgular gibi çeşitli sorunlardan kaynaklanabilir. Buna ek olarak, bunu veritabanı genelinde sorgu yürütme sürelerinin dağılımını analiz etmek ve sorunları ortaya çıkmadan önce önlemek için proaktif adımlar atmak için de kullanabiliriz. - Veritabanının askıda göründüğü veya bir işlemin devam etmediği bir durumda olduğunuzda, veritabanı engellemeyi kontrol etmek çok mantıklıdır ve bu sorguyu bloke eden tam sessionId'yi
blockedBy. - Parametre
openTransactionCount, herhangi bir zamanda bir veritabanındaki açık işlemlerin sayısını izlemek için kullanılır. Bu sayı sürekli olarak yüksekse, zamanında taahhüt edilmeyen veya geri alınmayan işlemler olduğunu gösterebilir. Bu, veritabanı performansını ve kullanılabilirliğini olumsuz yönde etkileyebilecek kaynak çekişmesi, artan kilitleme ve kilitlenmeler gibi sorunlara yol açabilir. Parametreyi, sorgu yürütme süresi ve sorgu bekleme süresi gibi diğer performans ölçümleriyle birlikte kullanarakopenTransactionCount, ilgilenmemiz gereken sorguları doğru bir şekilde belirleyebiliriz.
"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
}
Bu bölüm bize, yukarıdaki çıktıyı oluşturmak için snorql tarafından kullanılan sorgular hakkında ayrıntılar verir. Bu aynı zamanda kısa bir açıklama ve resmi Microsoft belgelerine hızlı bir başvuru ile birlikte gelir.
& , snorql'in belirli bir aralıkta bir sorgu çıktısının sonuç kümesini kaydetmemize ve depolamamıza yardımcı olduğu, geçmiş verileri yeniden ziyaret etmemize olanak tanıyan bir özelliğin parçasıdır supportsHistorical. minimumRepeatIntervalBu, otopsilerde, sorunları öncelik sırasına koymada ve anormallikleri bulmada yardımcı olacaktır. Bu özellik, kendine ait ayrı bir ayrıntılı gönderi gerektirir.
"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"
}
Tüm kodu kontrol etmek istiyorsanız, burayı ziyaret edinhttps://github.com/lakshmi-udaan/hawkeye
Sonraki adımlar
Yaptığımız?
Gerekli verileri elde ettikten sonra, güçlü bir görselleştirme aracı oluşturmak için yola çıktık. Bu amaçla, API'leri kullanıcı dostu bir UI katmanıyla zenginleştirdik ve hem tüm veritabanlarının kapsamlı kuşbakışı görünümünü hem de tek tek veritabanlarının ayrıntılı, parçalı görünümlerini sağlayan SQL Dashboard'u ürettik. Kuruluşumuzun geliştiricileri, SQL ile ilgili görevler için büyük ölçüde buna güveniyor. Ne yazık ki, şu anda açık kaynak değil, ancak ilgileniyorsanız, daha fazla tartışmaktan memnuniyet duyarım. İşte aynı gizlice bir zirve.
Ne yapabilirsin?
Artık snorql'u nasıl kullanacağınızı bildiğinize göre, tam potansiyelini ortaya çıkarmanız ve veritabanı performansınızı katlanarak artırmaya başlamanız an meselesi.
Kullanılabilir tüm metriklerin listesini burada bulabilirsiniz . Bu ölçümleri, buradaSqlMetricManager.getMetric() Etkin Sorgular için API uç noktası oluştururken yaptığımız gibi, içeriye iletilen parametreleri değiştirerek elde edebilirsiniz .
Bir sonraki gönderimde, veritabanı üretkenliğinizi 10 kata çıkarmak için bu ölçütlerden bazılarını nasıl kullanabileceğimizi derinlemesine inceleyeceğiz.
Okuduğunuz için teşekkürler!
SSS
- xyz'de com.udaan.snorql:snorql-framework:pom:0.5.6 yapıtı bulunamadı
Çözüm: Birmvn clean install. Bu, önceki yapıdan yaratılanları temizleyecek, ardından projenizi oluşturacak ve kavanozları yerel maven deponuza (.m2\depo) ekleyecektir. - Sizden bu hata istenirse Çözüm: . eklemeyi kaçırdınız
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

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































