스노클 시작하기

Mar 16 2023
글쎄요, Udaan에서도 상황은 그다지 다르지 않았습니다. 그때 우리 중 일부는 문제를 직접 해결하고 이러한 문제를 선제적으로 해결하는 데 도움이 되는 도구를 만들기로 결정했습니다. Enter ... snorql이란 무엇입니까? snorql은 SQL 메트릭을 사용하여 데이터베이스 관련 문제를 모니터링하고 진단하기 위해 Udaan에서 개발한 오픈 소스 프로젝트입니다.
  • 이 게시물에서 무엇을 기대합니까?
  • 도구 알기
    -
    Dropwizard
    -
    Kotlin
    -
    Maven
  • 로컬 머신 설정
  • 애플리케이션 설정
    -
    새 프로젝트 만들기
    -
    종속성 추가
    -
    빌드 및 컴파일
    -
    프로젝트 구조
    -
    코드
  • 애플리케이션 빌드 및 실행
  • 다음 단계
  • FAQ

글쎄요, Udaan에서도 상황은 그다지 다르지 않았습니다. 그때 우리 중 일부는 문제를 직접 해결하고 이러한 문제를 선제적으로 해결하는 데 도움이 되는 도구를 만들기로 결정했습니다.

입력하다 …

스노클이란?

snorql은 SQL 메트릭을 사용하여 데이터베이스 관련 문제를 모니터링하고 진단하기 위해 Udaan에서 개발한 오픈 소스 프로젝트입니다.

모든 데이터베이스의 성능에 대한 가시성을 제공하므로 추측 게임을 중단하고 쉽게 데이터베이스 최적화를 시작할 수 있습니다. 이렇게 추가된 가시성은 우리 조직의 게임 체인저였습니다. 그것은 모든 팀의 책임을 강화했습니다.

결과는 스스로를 말해줍니다. 스노클 덕분에

  • 50개 이상의 데이터베이스에서 향상된 성능을 확인했습니다.
  • 클라우드 비용을 60% 이상 절감했습니다.
  • 개발자 생산성 향상
  • 디버깅 시간 단축

내 서문이 당신의 흥분을 불러일으켰고 시작하고 싶은 열망이 있다면 잘 찾아오신 것입니다. 그러나 더 설득력이 필요한 경우 snorql — diagnosing databases like a boss 라는 환상적인 기사를 확인하십시오 .

이 게시물에서 무엇을 기대합니까?

Snorql은 Active Queries, Blocked Queries, Index Stats, Database Growth 등과 같은 여러 메트릭을 노출합니다. 여기에 전체 목록이 있습니다 . 이 게시물에서는 활성 쿼리를 선택합니다. 활성 쿼리는 쿼리 성능을 실시간으로 모니터링하고 최적화해야 하는 SQL Server 사용자에게 유용한 도구입니다.

snorql이 게시물에서는 간단한 Kotlin Dropwizard 애플리케이션에 통합하는 방법을 보여드리겠습니다 ( 다른 Java 프레임워크에서도 동일하게 복제할 수 있음 ). 이 자습서의 끝에서 애플리케이션은 주어진 데이터베이스에 대한 실시간 쿼리 통계를 찾을 수 있는 RESTful API를 노출합니다.

당신의 도구를 알고

Kotlin, Dropwizard 및 Maven에 이미 익숙한 사용자는 이 섹션을 건너뛰어도 됩니다.

드랍위저드

Dropwizard는 RESTful 웹 서비스를 구축하기 위한 가벼운 Java 프레임워크입니다. Dropwizard는 Jersey, Jackson 및 JDBI와 같은 안정적인 라이브러리를 가벼운 패키지로 수집합니다. 자세한 내용은 방문https://www.dropwizard.io/en/latest/.

재미있는 사실: Dropwizard는 Ruby 프로그래밍 언어의 인기 있는 웹 애플리케이션 프레임워크인 Ruby on Rails에서 영감을 받았습니다. Dropwizard의 제작자는 동일한 수준의 생산성과 사용 편의성을 Java 에코시스템에 제공하기를 원했습니다.

코틀린

Kotlin은 러시아에 기반을 둔 소프트웨어 개발 회사인 JetBrains에서 만든 기능 및 객체 지향 프로그래밍을 지원하는 프로그래밍 언어입니다. Kotlin의 구문과 개념은 C#, Scala 및 Java와 유사합니다. 자세한 내용은 방문https://kotlinlang.org/

Kotlin에 대한 한 가지 재미있는 사실은 그 이름이 실제로 Kotlin Island라고 하는 러시아 상트페테르부르크 근처의 섬에서 유래되었다는 것입니다. Kotlin의 제작자는 많은 사람들이 상트페테르부르크 또는 그 주변에 살고 있고 섬이 이 지역에서 잘 알려진 랜드마크이기 때문에 이 이름을 선택했습니다.

메이븐

Maven은 Java용 빌드 자동화 및 관리 도구입니다. Maven을 사용하면 소프트웨어 빌드 및 종속성을 쉽게 정의할 수 있습니다.

재미있는 사실: Maven은 2002년 Jason van Zyl이 시카고 오헤어 공항에서 비행기를 기다리는 동안 만들었습니다.

로컬 머신 설정

동일한 기사와 YouTube 동영상을 많이 찾을 수 있지만 몇 가지 빠른 참조를 첨부했습니다.

  • maven 설치 및 설정 —https://www.freecodecamp.org/news/how-to-get-started-with-maven-36851d8cfd96/
  • 코틀린 설치 —https://www.oreilly.com/library/view/kotlin-cookbook/9781492046660/ch01.html
  • IntelliJ 설치 —https://www.jetbrains.com/help/idea/installation-guide.html

이 섹션에서는 Maven, Kotlin 및 IntelliJ(또는 maven 프로젝트를 지원하는 다른 IDE)를 이미 설정했다고 가정합니다.

새 프로젝트 만들기

  1. 파일 -> 새로 만들기 -> 프로젝트 -> Maven을 클릭합니다. 다음 팝업이 표시됩니다.

3. IDE는 다음 구조를 갖는 프로젝트와 함께 pom.xml 파일을 엽니다.

종속성 추가

구현을 시작하기 전에 프로젝트에 필요한 특정 종속성을 파일에 추가해야 합니다 pom.xml. 함께 합시다.

속성 태그에서 Kotlin 및 Dropwizard의 버전을 정의하는 것으로 시작합니다.

<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

데이터베이스에 연결하려면 이 종속성이 필요합니다. 여기서 jdbi3를 사용하고 있습니다. 이는 JDBC/JDBI의 모든 버전에서 작동합니다.

속성:

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

애플리케이션이 SQL 서버 데이터베이스에 성공적으로 연결할 수 있으려면 이를 추가해야 합니다. 이것을 생략하면 악명 높은 예외가 발생합니다 java.sql.SQLException: No suitable driver found. 여기서는 SQL 서버에 해당하는 미리 정의된 메트릭을 제공하는 모듈을 사용할 것이므로 snorql-extensions이 드라이버를 사용합니다.

snorql-framework기본 도구의 기본 프레임워크인 다른 모듈이 있습니다 . Postgres, MySQL 등과 같은 다양한 데이터베이스에 대해 이 프레임워크를 활용하는 방법을 알게 될 다음 기사에서 이에 대해 알아볼 것입니다.

속성:

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

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

자, 이것을 생략할 수 없다!

속성:

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

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

빌드 및 컴파일

다음 단계는 소스 코드를 컴파일하기 위해 소스 디렉토리를 지정하는 것 <sourceDirectory>입니다 <testSourceDirectory>. 또한 소스 코드를 컴파일하는 데 필요한 Kotlin 플러그인을 구성합니다.

pom.xml종속성 섹션 뒤에 표시된 대로 코드를 추가합니다.

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

이렇게 하면 kotlin이 빨간색으로 강조 표시됩니다. 경로가 현재 존재하지 않기 때문에 다음 섹션 → 프로젝트 구조로 이동합니다.

프로젝트 구조

이것은 내 프로젝트 구조입니다. 요구 사항에 따라 시작하고 나중에 사용자 정의하기 위해 동일하게 이동할 수 있습니다.

암호

1단계:config.yml 내부에 파일을 생성하여 시작합니다 src/main/resources. 구성 클래스의 인스턴스로 역직렬화될 이 구성 파일에서 매개변수를 정의할 수 있습니다. 최소 하나의 매개변수를 추가해야 합니다. 그렇지 않으면 Dropwizard 프레임워크에서 컴파일 중에 오류가 발생합니다. 계속해서 다음을 추가해 보겠습니다.

environment: local

package com.hawkeye.configuration

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


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

4단계:BootstrapSnorqlApplication 다음으로 경로 내에 .kt 파일을 만들고 src/main/kotlin/com/hawkeye다음 코드를 추가합니다.

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

5단계:Connection 이제 노출하는 인터페이스를 구현해야 합니다 snorql-framework. 그것을 부르자 & 그것은 사용자의 데이터베이스와 상호 작용하는 데 SqlServerConnection필요한 메소드를 보유할 것입니다 . snorql이 게시물의 경우 run()방법만 구현하면 충분합니다. 별도의 자세한 블로그 게시물에서 다른 항목을 살펴보겠습니다.

SqlServerConnection.kt경로에 파일을 만들고 src/main/kotlin/com/hawkeye/core아래 코드를 추가하십시오.

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은 응용 프로그램과 통합 및 사용할 수 있는 많은 유용한 SQL 메트릭을 노출합니다. 이 게시물에서는 데이터베이스를 사용해 본 적이 있는 모든 사람에게 가장 관련성이 높은 지표인 Active Queries.

라이브 쿼리 통계라고도 하는 활성 쿼리는 사용자가 쿼리 진행 상황을 실시간으로 모니터링할 수 있는 SQL Server의 기능입니다. 완료 비율, 경과 시간, 남은 예상 시간과 같은 쿼리 상태에 대한 정보와 쿼리를 처리하기 위해 SQL Server에서 사용하는 실행 계획을 제공합니다.

이를 위해 SnorqlMetricsResource.kt내부에 파일을 만들고 src/main/kotlin/com/hawkeye/resources아래 코드를 추가하십시오.

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

애플리케이션 빌드 및 실행

우리는 우리의 실행 준비가되었습니다HawkeyeApplication

그렇게 하려면 아래와 같이 구성을 추가하십시오.

server src/main/resources/config.yml프로그램 인수에 추가했음을 주목하십시오 . 이렇게 하면 Dropwizard 앱이 서버로 실행되고 제공된 구성 파일의 위치에 대해 실행됩니다.

모든 것이 잘 진행되면 터미널에 다음과 같은 내용이 표시되어야 합니다. 그렇지 않고 약간의 오류가 있다고 소리쳐도 걱정하지 마세요. FAQ 섹션으로 이동하여 내가 직면한 오류/해결 방법을 확인하십시오.

Postman 또는 기타 유사한 도구로 이동하여 API를 테스트합니다. 가져오기 클릭 -> 원시 텍스트 -> 아래 제공된 컬 호출을 복사하여 붙여넣기 -> 계속 클릭 -> 보내기 클릭

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

여기에서 데이터베이스에 대한 모든 활성 쿼리를 보기 위해 쿼리했습니다 db-prod. 응답은 3 부분으로 나뉩니다.

메트릭 입력

이는 선택적 필드에 기본값과 함께 사용자가 제공한 입력을 반환합니다.

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

그러면 관련된 모든 관련 매개 변수와 함께 데이터베이스에서 현재 실행 중인 쿼리 목록이 제공됩니다. 이는 다음 시나리오에서 유용할 수 있습니다.

  • 데이터베이스에서 늘어난 대기 시간을 디버깅하려고 할 때 & CPU를 독차지하고 있는 장기 실행 쿼리가 있는지 확인하고 싶을 때 elapsedTime. 이러한 장기 실행 쿼리는 비효율적인 쿼리 계획, 최적이 아닌 인덱싱 또는 잘못 작성된 쿼리와 같은 다양한 문제로 인해 발생할 수 있습니다. 이 외에도 이를 사용하여 데이터베이스 전체의 쿼리 실행 시간 분포를 분석하고 문제가 발생하기 전에 사전 예방 조치를 취할 수 있습니다.
  • 데이터베이스가 정지된 것처럼 보이거나 프로세스가 진행되지 않는 상태에 있을 때 데이터베이스 차단을 확인하는 것은 매우 의미가 있으며 의 도움으로 이 쿼리를 차단하는 정확한 sessionId를 알아낼 수 있습니다 blockedBy.
  • 이 openTransactionCount매개변수는 지정된 시간에 데이터베이스에서 열린 트랜잭션 수를 모니터링하는 데 사용됩니다. 이 수가 지속적으로 높으면 적시에 커밋되거나 롤백되지 않는 트랜잭션이 있음을 나타낼 수 있습니다. 이로 인해 리소스 경합, 잠금 증가, 교착 상태 등의 문제가 발생하여 데이터베이스 성능과 가용성에 부정적인 영향을 줄 수 있습니다. 쿼리 실행 시간 및 쿼리 대기 시간과 같은 다른 성능 메트릭과 함께 매개 변수를 사용하면 openTransactionCount주의가 필요한 쿼리를 올바르게 식별할 수 있습니다.

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

이 섹션에서는 위의 출력을 생성하기 위해 snorql에서 사용하는 쿼리에 대한 세부 정보를 제공합니다. 여기에는 공식 Microsoft 문서에 대한 간략한 설명 및 빠른 참조도 함께 제공됩니다.

& supportsHistorical는 minimumRepeatIntervalsnorql이 우리가 과거 데이터를 다시 방문할 수 있도록 주어진 간격으로 쿼리 출력의 결과 집합을 기록하고 저장하는 데 도움이 되는 기능의 일부입니다. 이렇게 하면 사후 분석, 문제 분류 및 이상 징후 발견에 도움이 됩니다. 이 기능을 사용하려면 별도의 세부 게시물이 필요합니다.

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

전체 코드를 확인하려면 여기를 방문하세요.https://github.com/lakshmi-udaan/hawkeye

다음 단계

우리는 무엇을 했습니까?

필요한 데이터를 얻은 후 우리는 강력한 시각화 도구를 만들기 시작했습니다. 이를 위해 우리는 사용자 친화적인 UI 계층으로 API를 보강하고 모든 데이터베이스에 대한 포괄적인 조감도와 개별 데이터베이스에 대한 상세하고 세분화된 보기를 모두 제공하는 SQL 대시보드를 생성했습니다. 우리 조직의 개발자는 SQL 관련 작업에 크게 의존합니다. 유감스럽게도 현재 오픈 소스가 아니지만 관심이 있는 경우 추가로 논의할 수 있어 기쁩니다. 다음은 같은 내용의 몰래 피크입니다.

snorql을 사용하여 구축된 udaan의 SQL 진단 및 모니터링 대시보드

무엇을 할 수 있습니까?

이제 snorql을 사용하는 방법을 알았으므로 잠재력을 최대한 발휘하고 데이터베이스 성능을 기하급수적으로 향상시키는 것은 시간 문제입니다.

여기에서 사용 가능한 모든 메트릭 목록을 찾을 수 있습니다 . 여기에서SqlMetricManager.getMetric() 활성 쿼리에 대한 API 엔드포인트를 생성하는 동안 수행한 것처럼 내부에 전달되는 매개변수를 간단히 변경하여 이러한 메트릭을 얻을 수 있습니다 .

다음 게시물에서는 이러한 메트릭 중 일부를 사용하여 데이터베이스 생산성을 10배로 향상시키는 방법에 대해 자세히 살펴보겠습니다.

읽어 주셔서 감사합니다!

FAQ

  • xyz에서 아티팩트 com.udaan.snorql:snorql-framework:pom:0.5.6을 찾을 수 없습니다.
    해결책: mvn clean install. 이것은 이전 빌드에서 생성된 모든 것을 정리한 다음 프로젝트를 빌드하고 항아리를 로컬 maven 저장소(.m2\repository)에 추가합니다.
  • 이 오류 메시지가 표시되면 해결 방법: 를 로드해야 합니다 . 추가를 놓쳤습니다.java.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