요청 로깅(Request logging)

요청 로깅(Request logging)

쿼리를 서빙할 수 있는 모든 Apache Druid 서비스는 처리하는 쿼리 요청을 로깅할 수 있어요. 이 문서에서는 Druid가 쿼리 메트릭을 추적하기 위한 요청 로그를 생성하도록 구성하는 방법을 설명드릴게요.

출처: 문서

본문

쿼리를 서빙할 수 있는 모든 Apache Druid 서비스는 처리하는 쿼리 요청을 로깅할 수 있습니다. 요청 로그에는 실행 시간과 메모리 사용량을 포함한 쿼리 메트릭 정보가 담겨 있어요. 요청 로그의 정보를 사용해 쿼리 성능을 모니터링하고, 병목 현상을 파악하며, 느린 쿼리를 분석하고 개선할 수 있어요.

요청 로깅은 기본적으로 비활성화되어 있습니다. 이 주제에서는 쿼리 메트릭을 추적하기 위해 Druid가 요청 로그를 생성하도록 구성하는 방법을 설명해요.

요청 로깅 구성

요청 로깅을 활성화하려면 사용할 요청 로거 타입을 결정한 다음, 해당 요청 로거 타입에 특화된 구성을 설정하세요. 사용 가능한 요청 로거 타입은 다음과 같아요:

  • noop: 요청 로깅을 비활성화합니다. 기본 동작입니다.
  • file: 로그를 디스크에 저장합니다.
  • emitter: 에미터(emitter)를 통해 구성되는 외부 위치로 요청을 로깅합니다.
  • slf4j: SLF4J Java 로깅 API를 통해 쿼리를 로깅합니다.
  • filtered: 쿼리 타입이나 실행 시간으로 요청을 필터링한 다음, 위임된 요청 로거에 의해 필터링된 쿼리를 로깅합니다.
  • composing: 모든 요청을 여러 요청 로거에 로깅합니다.
  • switching: 네이티브 쿼리와 SQL 쿼리를 별도의 요청 로거에 로깅합니다.

요청 로거의 타입을 druid.request.logging.type에 정의하세요. 각 요청 로거 타입에 설정할 속성은 Request logging configuration 문서를 참고하세요. 이 속성들은 common.runtime.properties 파일에 지정합니다. 변경 사항이 적용되려면 Druid를 다시 시작해야 합니다.

Druid는 요청 로깅 타입이 emitter가 아닌 한 결과를 Broker 로그에 저장해요. emitter 요청 로깅을 사용한다면 메트릭 에미션(metrics emission)도 구성해야 합니다.

메트릭 에미션 구성

Druid에는 메트릭과 알림을 보내기 위한 다양한 에미터가 포함되어 있습니다. 쿼리 메트릭을 내보내려면 druid.request.logging.feed=emitter를 설정하고, druid.emitter 속성에 에미터 타입을 정의하세요. Druid에서 다음 에미터 중 어느 것이든 사용할 수 있어요:

  • noop: 메트릭 에미션을 비활성화합니다. 기본 동작입니다.
  • logging: Log4j 2로 메트릭을 내보냅니다. Druid와 함께 사용하기 위한 Log4j 2 구성은 Logging 문서를 참고하세요.
  • http: 메트릭을 JSON 형식으로 포함한 HTTP POST 요청을 사용자 정의 엔드포인트로 보냅니다.
  • parametrized: http 에미터처럼 동작하지만, 이벤트 피드에 따라 수신 URL을 세밀하게 조정합니다.
  • composing: 여러 에미터 타입으로 메트릭을 내보냅니다.
  • graphite: Graphite Carbon 서비스로 메트릭을 내보냅니다.

이 속성들은 common.runtime.properties 파일에 지정합니다. 각 메트릭 에미터 타입에 설정할 속성은 Metrics emitters configuration 문서를 참고하세요. 변경 사항이 적용되려면 Druid를 다시 시작해야 합니다.

예시

다음 구성은 요청 로깅을 활성화하고 쿼리 메트릭을 http://example.com:8080/path 엔드포인트로 게시하는 방법을 보여줘요.

# Enable request logging and configure the emitter request logger
druid.request.logging.type=emitter
druid.request.logging.feed=myRequestLogFeed

# Enable metrics emission and tell Druid where to emit messages
druid.emitter=http
druid.emitter.http.recipientBaseUrl=http://example.com:8080/path

# Authenticate to the base URL, if needed
druid.emitter.http.basicAuthentication=username:password

다음은 로그 에미터 출력 예시를 보여줘요:

[
    {
        "feed": "metrics",
        "timestamp": "2022-01-06T20:32:06.628Z",
        "service": "druid/broker",
        "host": "localhost:8082",
        "version": "2022.01.0-iap-SNAPSHOT",
        "metric": "sqlQuery/bytes",
        "value": 9351,
        "dataSource": "[wikipedia]",
        "id": "56e8317b-31cc-443d-b109-47f51b21d4c3",
        "nativeQueryIds": "[2b9cbced-11fc-4d78-a58c-c42863dff3c8]",
        "remoteAddress": "127.0.0.1",
        "success": "true"
    },
    {
        "feed": "myRequestLogFeed",
        "timestamp": "2022-01-06T20:32:06.585Z",
        "remoteAddr": "127.0.0.1",
        "service": "druid/broker",
        "sqlQueryContext":
        {
            "useApproximateCountDistinct": false,
            "sqlQueryId": "56e8317b-31cc-443d-b109-47f51b21d4c3",
            "useApproximateTopN": false,
            "useCache": false,
            "sqlOuterLimit": 101,
            "populateCache": false,
            "nativeQueryIds": "[2b9cbced-11fc-4d78-a58c-c42863dff3c8]"
        },
        "queryStats":
        {
            "sqlQuery/time": 43,
            "sqlQuery/planningTimeMs": 5,
            "sqlQuery/bytes": 9351,
            "success": true,
            "context":
            {
                "useApproximateCountDistinct": false,
                "sqlQueryId": "56e8317b-31cc-443d-b109-47f51b21d4c3",
                "useApproximateTopN": false,
                "useCache": false,
                "sqlOuterLimit": 101,
                "populateCache": false,
                "nativeQueryIds": "[2b9cbced-11fc-4d78-a58c-c42863dff3c8]"
            },
            "identity": "allowAll"
        },
        "query": null,
        "host": "localhost:8082",
        "sql": "SELECT * FROM wikipedia WHERE cityName = 'Buenos Aires'"
    },
    {
        "feed": "myRequestLogFeed",
        "timestamp": "2022-01-06T20:32:07.652Z",
        "remoteAddr": "",
        "service": "druid/broker",
        "sqlQueryContext":
        {},
        "queryStats":
        {
            "query/time": 16,
            "query/bytes": -1,
            "success": true,
            "identity": "allowAll"
        },
        "query":
        {
            "queryType": "scan",
            "dataSource":
            {
                "type": "table",
                "name": "wikipedia"
            },
            "intervals":
            {
                "type": "intervals",
                "intervals":
                [
                    "-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z"
                ]
            },
            "virtualColumns":
            [
                {
                    "type": "expression",
                    "name": "v0",
                    "expression": "'Buenos Aires'",
                    "outputType": "STRING"
                }
            ],
            "resultFormat": "compactedList",
            "batchSize": 20480,
            "limit": 101,
            "filter":
            {
                "type": "selector",
                "dimension": "cityName",
                "value": "Buenos Aires",
                "extractionFn": null
            },
            "columns":
            [
                "__time",
                "added",
                "channel",
                "comment",
                "commentLength",
                "countryIsoCode",
                "countryName",
                "deleted",
                "delta",
                "deltaBucket",
                "diffUrl",
                "flags",
                "isAnonymous",
                "isMinor",
                "isNew",
                "isRobot",
                "isUnpatrolled",
                "metroCode",
                "namespace",
                "page",
                "regionIsoCode",
                "regionName",
                "user",
                "v0"
            ],
            "context":
            {
                "populateCache": false,
                "queryId": "62e3d373-6e50-41b4-873b-1e56347c2950",
                "sqlOuterLimit": 101,
                "sqlQueryId": "cbb3d519-aee9-4566-8920-dbbeab6269f5",
                "useApproximateCountDistinct": false,
                "useApproximateTopN": false,
                "useCache": false
            },
            "descending": false,
            "granularity":
            {
                "type": "all"
            }
        },
        "host": "localhost:8082",
        "sql": null
    },
    ...
]

더 알아보기 (Learn more)

자세한 내용은 다음 주제들을 참고하세요.

  • Query metrics
  • Request logging configuration
  • Metrics emitters configuration