Bắt đầu với snorql

Mar 16 2023
Chà, tình hình ở Udaan cũng không khác lắm & đó là lúc một số người trong chúng tôi quyết định tự mình giải quyết vấn đề và tạo ra một công cụ giúp giải quyết trước những vấn đề này. Enter… Snorql là gì? snorql là một dự án nguồn mở được phát triển tại Udaan nhằm theo dõi và chẩn đoán các sự cố liên quan đến cơ sở dữ liệu bằng cách sử dụng các số liệu SQL.
  • Những gì mong đợi từ bài viết này?
  • Biết các công cụ của bạn
    -
    Dropwizard
    -
    Kotlin
    -
    Maven
  • Thiết lập máy cục bộ của bạn
  • Thiết lập ứng dụng của bạn
    -
    Tạo dự án mới
    -
    Thêm phụ thuộc
    -
    Xây dựng & Biên dịch
    -
    Cấu trúc dự án
    -
    Mã
  • Xây dựng & Chạy ứng dụng
  • Bước tiếp theo
  • câu hỏi thường gặp

Chà, tình hình ở Udaan cũng không khác lắm & đó là lúc một số người trong chúng tôi quyết định tự mình giải quyết vấn đề và tạo ra một công cụ giúp giải quyết trước những vấn đề này.

Đi vào …

Snorql là gì?

snorql là một dự án nguồn mở được phát triển tại Udaan nhằm theo dõi và chẩn đoán các sự cố liên quan đến cơ sở dữ liệu bằng cách sử dụng các số liệu SQL.

Nó cung cấp khả năng hiển thị mọi cơ sở dữ liệu đang hoạt động như thế nào, vì vậy bạn có thể ngừng chơi trò chơi đoán và bắt đầu tối ưu hóa cơ sở dữ liệu của mình một cách dễ dàng. Và để tôi nói cho bạn biết, khả năng hiển thị được bổ sung này đã là yếu tố thay đổi cuộc chơi cho tổ chức của chúng tôi. Nó đã thúc đẩy trách nhiệm giải trình của mỗi đội.

Các kết quả nói cho mình. Cảm ơn snorql,

  • Chúng tôi đã thấy hiệu suất tăng lên trên hơn 50 cơ sở dữ liệu.
  • Giảm hơn 60% chi phí đám mây.
  • Tăng năng suất của nhà phát triển
  • Giảm thời gian gỡ lỗi

Nếu phần mở đầu của tôi đã khơi dậy sự phấn khích của bạn và bạn háo hức bắt đầu, thì bạn đã đến đúng nơi. Nhưng trong trường hợp bạn cần thuyết phục hơn nữa, hãy nhớ xem bài viết tuyệt vời có tiêu đề snorql — chẩn đoán cơ sở dữ liệu như một ông chủ .

Những gì mong đợi từ bài viết này?

Snorql hiển thị nhiều số liệu như Truy vấn đang hoạt động, Truy vấn bị chặn, Chỉ số thống kê chỉ mục, Tăng trưởng cơ sở dữ liệu, v.v... danh sách đầy đủ tại đây . Đối với bài đăng này, chúng tôi sẽ chọn các Truy vấn đang hoạt động. Truy vấn Hoạt động là một công cụ có giá trị dành cho người dùng SQL Server, những người cần theo dõi và tối ưu hóa hiệu suất truy vấn của họ trong thời gian thực.

Trong bài đăng này, tôi sẽ chỉ cho bạn cách tích hợp snorqlvào một ứng dụng Kotlin Dropwizard đơn giản ( Bạn cũng có thể sao chép tương tự trong bất kỳ Khung công tác Java nào khác ). Khi kết thúc hướng dẫn này, ứng dụng của bạn sẽ hiển thị API RESTful bằng cách sử dụng API mà bạn sẽ có thể tìm ra số liệu thống kê truy vấn trực tiếp cho bất kỳ cơ sở dữ liệu cụ thể nào.

Biết các công cụ của bạn

Đối với những người đã quen thuộc với Kotlin, Dropwizard và Maven, vui lòng bỏ qua phần này.

thuật sĩ thả

Dropwizard là một khung công tác Java nhẹ để xây dựng các dịch vụ web RESTful. Dropwizard thu thập các thư viện ổn định, chẳng hạn như Jersey, Jackson và JDBI, thành một gói nhẹ. Để biết thêm chi tiết, hãy truy cậphttps://www.dropwizard.io/en/latest/.

Sự thật thú vị: Dropwizard được lấy cảm hứng từ Ruby on Rails, một khung ứng dụng web phổ biến bằng ngôn ngữ lập trình Ruby. Những người tạo ra Dropwizard muốn mang lại cùng một mức năng suất và tính dễ sử dụng cho hệ sinh thái Java.

Kotlin

Kotlin là ngôn ngữ lập trình hỗ trợ lập trình hướng đối tượng và chức năng được tạo bởi JetBrains, một công ty phát triển phần mềm có trụ sở tại Nga. Cú pháp và khái niệm của Kotlin tương tự như C#, Scala và Java. Để biết thêm chi tiết, hãy truy cậphttps://kotlinlang.org/

Một sự thật thú vị về Kotlin là tên của nó thực sự bắt nguồn từ một hòn đảo gần St. Petersburg, Nga, được gọi là Đảo Kotlin. Những người tạo ra Kotlin đã chọn tên này vì nhiều người trong số họ sống trong hoặc xung quanh St. Petersburg và hòn đảo này là một địa danh nổi tiếng trong khu vực.

maven

Maven là một công cụ quản lý và tự động hóa xây dựng cho Java. Với Maven, thật dễ dàng để xác định việc xây dựng phần mềm và các phần phụ thuộc.

Sự thật thú vị: Maven được tạo ra bởi Jason van Zyl vào năm 2002 khi anh ấy đang chờ chuyến bay tại Sân bay O'Hare của Chicago.

Thiết lập máy cục bộ của bạn

Bạn sẽ tìm thấy rất nhiều bài viết và video YouTube giống nhau, tuy nhiên, tôi đã đính kèm một số tài liệu tham khảo nhanh

  • Cài đặt & Thiết lập maven —https://www.freecodecamp.org/news/how-to-get-started-with-maven-36851d8cfd96/
  • Cài đặt Kotlin —https://www.oreilly.com/library/view/kotlin-cookbook/9781492046660/ch01.html
  • Cài đặt IntelliJ —https://www.jetbrains.com/help/idea/installation-guide.html

Phần này giả định rằng bạn đã thiết lập Maven, Kotlin & IntelliJ (hoặc bất kỳ IDE nào khác có hỗ trợ cho các dự án maven).

Tạo một dự án mới

  1. Bấm vào Tệp -> Mới -> Dự án -> Maven. Bạn sẽ thấy cửa sổ bật lên sau

3. IDE của bạn sẽ mở tệp pom.xml với dự án có cấu trúc sau.

Thêm phụ thuộc

Trước khi bắt đầu triển khai, chúng ta cần thêm các phụ thuộc cụ thể cần thiết cho dự án vào tệp pom.xml. Chúng ta hãy làm cùng nhau.

Chúng tôi bắt đầu bằng cách xác định các phiên bản của Kotlin & Dropwizard trong thẻ thuộc tính.

<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

Chúng tôi sẽ cần sự phụ thuộc này để tạo kết nối với cơ sở dữ liệu. Tôi đang sử dụng jdbi3 ở đây. Điều này sẽ hoạt động với bất kỳ phiên bản JDBC/JDBI nào.

Của cải:

<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>

Chúng tôi sẽ cần thêm phần này để ứng dụng có thể kết nối thành công với cơ sở dữ liệu máy chủ SQL. Bỏ qua điều này sẽ cung cấp cho bạn java.sql.SQLException: No suitable driver foundngoại lệ khét tiếng. Ở đây, tôi sẽ sử dụng snorql-extensionsmô-đun cung cấp cho chúng tôi các số liệu được xác định trước tương ứng với máy chủ SQL, do đó chúng tôi sẽ sử dụng trình điều khiển này.

Có tồn tại một mô-đun khác, snorql-frameworkđó là khung cơ bản của công cụ cơ bản. Tôi sẽ khám phá điều đó trong một bài viết sắp tới, nơi chúng ta sẽ biết cách tận dụng khung này cho các cơ sở dữ liệu khác nhau như Postgres, MySQL, v.v…

Của cải:

<mssql.version>9.2.1.jre8</mssql.version>

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>${mssql.version}</version>
</dependency>

Chà, không thể bỏ qua cái này!

Của cải:

<snorql.version>0.5.6</snorql.version>

<dependency>
    <groupId>com.udaan.snorql</groupId>
    <artifactId>snorql-extensions</artifactId>
    <version>${snorql.version}</version>
</dependency>

Xây dựng & Biên dịch

Bước tiếp theo là chỉ định các thư mục nguồn trong <sourceDirectory>và trong <testSourceDirectory>để biên dịch mã nguồn. Chúng tôi cũng sẽ định cấu hình plugin Kotlin cần thiết để biên dịch mã nguồn của chúng tôi.

Thêm mã vào pom.xmlnhư được hiển thị sau phần phụ thuộc

<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>

Ngay sau khi bạn làm điều này, bạn sẽ thấy kotlin được đánh dấu màu đỏ. Điều này là do hiện tại đường dẫn không tồn tại, điều này đưa chúng ta đến phần tiếp theo → cấu trúc dự án

Cấu trúc dự án

Đây là cấu trúc dự án của tôi. Bạn có thể bắt đầu với điều tương tự để bắt đầu và sau đó tùy chỉnh theo yêu cầu của bạn.

Mã số

Bước 1: Chúng tôi bắt đầu bằng cách tạo một config.ymltệp bên trong src/main/resources. Chúng ta có thể định nghĩa các tham số trong tệp cấu hình này sẽ được giải tuần tự hóa thành một thể hiện của lớp cấu hình của chúng ta. Chúng ta cần thêm ít nhất một tham số, nếu không khung Dropwizard sẽ báo lỗi trong quá trình biên dịch. Hãy tiếp tục và thêm điều này:

environment: local

package com.hawkeye.configuration

import com.fasterxml.jackson.annotation.JsonProperty
import io.dropwizard.Configuration


class AppConfig(@JsonProperty("environment") val environment: String): Configuration()

Bước 4: Tiếp theo chúng ta tạo BootstrapSnorqlApplicationfile .kt bên trong đường dẫn src/main/kotlin/com/hawkeye& thêm đoạn code sau:

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 -> ""
        }
    }
}

Bước 5: Bây giờ chúng ta cần triển khai Connectiongiao diện snorql-frameworkhiển thị. Hãy gọi nó SqlServerConnectionvà nó sẽ chứa các phương thức cần thiết để snorqltương tác với cơ sở dữ liệu của người dùng. Đối với bài đăng này, run()chỉ cần thực hiện phương pháp là đủ. Chúng tôi sẽ khám phá những cái khác trong một bài đăng blog chi tiết riêng biệt.

Tạo một SqlServerConnection.kttệp trong đường dẫn src/main/kotlin/com/hawkeye/corevà thêm mã bên dưới.

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 hiển thị rất nhiều số liệu SQL hữu ích có thể được tích hợp và sử dụng với ứng dụng của bạn. Đối với bài đăng này, chúng tôi sẽ chọn số liệu phù hợp nhất với bất kỳ ai đã từng sử dụng cơ sở dữ liệu — Active Queries.

Active Queries, còn được gọi là thống kê truy vấn trực tiếp, là một tính năng trong SQL Server cho phép người dùng theo dõi tiến trình truy vấn của họ trong thời gian thực. Nó cung cấp thông tin về trạng thái của truy vấn, chẳng hạn như tỷ lệ phần trăm hoàn thành, thời gian đã trôi qua và thời gian ước tính còn lại, cũng như kế hoạch thực hiện được SQL Server sử dụng để xử lý truy vấn.

Đối với điều đó, hãy tạo một SnorqlMetricsResource.kttệp bên trong src/main/kotlin/com/hawkeye/resourcesvà thêm mã bên dưới.

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()

Xây dựng & Chạy ứng dụng

Chúng tôi đã sẵn sàng để chạyHawkeyeApplication

Để làm điều đó thêm cấu hình như hình dưới đây:

Lưu ý rằng chúng tôi đã thêm server src/main/resources/config.ymlvào các đối số chương trình. Điều này báo cho ứng dụng Dropwizard chạy như một máy chủ và dựa trên vị trí của tệp cấu hình được cung cấp.

Nếu mọi thứ suôn sẻ, bạn sẽ thấy một cái gì đó như thế này trong thiết bị đầu cuối. Nếu không và bạn bị mắng vì một số lỗi, đừng lo lắng, tôi cũng sẽ hỗ trợ bạn về điều đó. Chuyển đến phần Câu hỏi thường gặp và kiểm tra các lỗi/cách giải quyết mà tôi gặp phải.

Truy cập Postman hoặc bất kỳ công cụ tương tự nào khác và kiểm tra API. Nhấp vào Nhập -> Văn bản thô -> Sao chép, dán cuộc gọi cuộn tròn được cung cấp bên dưới -> Nhấp vào Tiếp tục -> Nhấp vào Gửi

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
}'

Ở đây, chúng tôi đã truy vấn để xem tất cả các truy vấn đang hoạt động cho cơ sở dữ liệu db-prod. Câu trả lời được chia thành 3 phần:

số liệu đầu vào

Điều này trả về đầu vào do người dùng cung cấp với các giá trị mặc định trong các trường tùy chọn.

"metricInput": {
    "from": null,
    "to": null,
    "recommendationRequired": false,
    "metricId": "performance_activeQueries",
    "metricPeriod": "REAL_TIME",
    "databaseName": "db-prod"
  }

Điều này cung cấp cho bạn danh sách các truy vấn đang chạy tại thời điểm này trong cơ sở dữ liệu của bạn cùng với tất cả các tham số liên quan được liên kết với chúng. Điều này có thể hữu ích trong các tình huống sau:

  • Khi bạn đang cố gắng gỡ lỗi độ trễ tăng lên trên cơ sở dữ liệu của mình và bạn muốn kiểm tra xem có bất kỳ truy vấn chạy dài nào đang ngốn CPU của bạn hay không bằng cách xem tệp elapsedTime. Những truy vấn chạy dài này có thể do nhiều vấn đề gây ra, chẳng hạn như kế hoạch truy vấn không hiệu quả, lập chỉ mục dưới mức tối ưu hoặc truy vấn được viết kém. Ngoài ra, chúng tôi cũng có thể sử dụng điều này để phân tích sự phân bổ thời gian thực hiện truy vấn trên cơ sở dữ liệu và thực hiện các bước chủ động để ngăn chặn sự cố trước khi chúng xảy ra.
  • Khi bạn đang ở trạng thái mà cơ sở dữ liệu có vẻ bị treo hoặc một quá trình không được tiến hành, việc kiểm tra việc chặn cơ sở dữ liệu sẽ rất có ý nghĩa & bạn có thể tìm ra sessionId chính xác đang chặn truy vấn này với sự trợ giúp của blockedBy.
  • Tham openTransactionCountsố được sử dụng để theo dõi số lượng giao dịch mở trong cơ sở dữ liệu tại bất kỳ thời điểm nào. Nếu số lượng này luôn cao, điều đó có thể cho thấy rằng có các giao dịch không được thực hiện hoặc khôi phục kịp thời. Điều này có thể dẫn đến các vấn đề như tranh chấp tài nguyên, tăng khóa và bế tắc, có thể tác động tiêu cực đến hiệu suất và tính khả dụng của cơ sở dữ liệu. Bằng cách sử dụng openTransactionCounttham số kết hợp với các chỉ số hiệu suất khác, chẳng hạn như thời gian thực hiện truy vấn và thời gian chờ truy vấn, chúng tôi có thể xác định chính xác các truy vấn cần chú ý.

"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
}

Phần này cung cấp cho chúng tôi thông tin chi tiết về các truy vấn được snorql sử dụng để tạo đầu ra ở trên. Điều này cũng đi kèm với một mô tả ngắn gọn và tham khảo nhanh đến tài liệu chính thức của Microsoft.

& là một phần của tính năng trong đó snorql giúp chúng tôi ghi lại và lưu trữ tập hợp kết quả của đầu ra truy vấn tại một khoảng thời gian nhất định cho phép chúng tôi xem lại dữ liệu trong quá khứ supportsHistorical. minimumRepeatIntervalĐiều này sẽ giúp ích cho việc khám nghiệm tử thi, xử lý các vấn đề và tìm ra điểm bất thường. Tính năng này yêu cầu một bài đăng chi tiết riêng biệt của riêng nó.

"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"
}

Nếu bạn muốn kiểm tra toàn bộ mã, hãy truy cập vào đây tạihttps://github.com/lakshmi-udaan/hawkeye

Bước tiếp theo

Những gì chúng ta đã làm?

Sau khi có được dữ liệu cần thiết, chúng tôi bắt đầu tạo ra một công cụ trực quan mạnh mẽ. Để đạt được mục tiêu này, chúng tôi đã tăng cường các API bằng lớp giao diện người dùng thân thiện với người dùng và tạo ra Bảng điều khiển SQL, cung cấp cả chế độ xem toàn diện về tất cả các cơ sở dữ liệu và chế độ xem chi tiết, chi tiết của từng cơ sở dữ liệu. Các nhà phát triển của tổ chức chúng tôi phụ thuộc rất nhiều vào nó cho các nhiệm vụ liên quan đến SQL. Rất tiếc, nó hiện không phải là mã nguồn mở, nhưng nếu bạn quan tâm, tôi rất sẵn lòng thảo luận thêm. Đây là một đỉnh cao lén lút của cùng một.

Bảng điều khiển Giám sát & Chẩn đoán SQL tại udaan được xây dựng bằng snorql

Bạn có thể làm gì?

Bây giờ bạn đã biết cách sử dụng snorql, chỉ còn là vấn đề thời gian trước khi bạn mở khóa toàn bộ tiềm năng của nó và bắt đầu tăng hiệu suất cơ sở dữ liệu của mình theo cấp số nhân.

Bạn có thể tìm thấy danh sách tất cả các số liệu có sẵn tại đây . Bạn có thể nhận các số liệu này bằng cách thay đổi các tham số được chuyển vào bên trong SqlMetricManager.getMetric()như chúng tôi đã làm khi tạo điểm cuối API cho Truy vấn hoạt động tại đây .

Trong bài đăng tiếp theo của tôi, chúng tôi sẽ đi sâu vào cách chúng tôi có thể sử dụng một số chỉ số này để nâng cao năng suất cơ sở dữ liệu của bạn lên gấp 10 lần.

Cảm ơn vì đã đọc!

câu hỏi thường gặp

  • Không thể tìm thấy vật phẩm com.udaan.snorql:snorql-framework:pom:0.5.6 trong xyz
    Giải pháp: Thực hiện mvn clean install. Điều này sẽ xóa mọi thứ được tạo từ bản dựng trước, sau đó xây dựng dự án của bạn và thêm các lọ vào kho lưu trữ maven cục bộ của bạn (.m2\repository)
  • Nếu bạn được nhắc với lỗi này Giải pháp: Bạn phải tải tệp . Bạn đã bỏ lỡ việc thêmjava.sql.SQLException: No suitable driver found
    jdbc drivermssql-jdbc

https://udaan-com.github.io/snorql/

https:///engineering-udaan/snorql-diagnosing-databases-like-a-boss-54f2e8fbf57a