다음을 통해 공유


샘플링 재정의 - Java용 Azure Monitor Application Insights

참고 항목

샘플링 재정의 기능은 3.5.0부터 GA로 제공됩니다.

샘플링 재정의를 사용하면 기본 샘플링 백분율을 재정의할 수 있습니다. 예를 들면 다음과 같습니다.

  • 잡음 상태 검사에 대한 샘플링 백분율을 0이나 작은 값으로 설정합니다.
  • 잡음 종속성 호출에 대한 샘플링 백분율을 0이나 작은 값으로 설정합니다.
  • 기본 샘플링이 더 낮은 것으로 구성된 경우에도 중요한 요청 형식(예: /login)에 대해 샘플링 백분율을 100으로 설정합니다.

용어

샘플링 재정의에 관해 알아보기 전에 ‘범위’라는 용어를 이해해야 합니다. 범위는 다음에 대한 일반적인 용어입니다.

  • 들어오는 요청.
  • 나가는 종속성(예: 다른 서비스에 대한 원격 호출).
  • In-process 종속성(예: 서비스의 하위 구성 요소에 의해 수행되는 작업).

샘플링 재정의의 경우 다음 범위 구성 요소가 중요합니다.

  • 특성

범위 특성은 지정된 요청 또는 종속성의 표준 및 사용자 지정 속성을 둘 다 나타냅니다.

시작하기

시작하려면 applicationinsights.json이라는 구성 파일을 만듭니다. 이를 동일한 디렉터리에 applicationinsights-agent-*.jar로 저장합니다. 다음 템플릿을 사용합니다.

{
  "connectionString": "...",
  "sampling": {
    "percentage": 10,
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          ...
        ],
        "percentage": 0
      },
      {
        "telemetryType": "request",
        "attributes": [
          ...
        ],
        "percentage": 100
      }
    ]
  }
}

작동 방식

telemetryType(Application Insights 3.4.0의 경우 telemetryKind)은 request, dependency, trace(로그) 또는 exception 중 하나여야 합니다.

범위가 시작될 때 해당 시간에 범위에 있는 범위 형식 및 특성을 사용하여 샘플링 재정의가 일치하는지 확인합니다.

일치 항목은 strict 또는 regexp 중 하나일 수 있습니다. 정규식 일치는 전체 특성 값에 대해 수행되므로 abc를 포함한 값을 일치시키려면 .*abc.*를 사용해야 합니다. 샘플링 재정의는 여러 특성 조건을 지정할 수 있습니다. 이 경우 샘플링 재정의에 대해 모두 일치해야 합니다.

샘플링 재정의 중 하나가 일치하는 경우 해당 샘플링 백분율을 사용하여 범위를 샘플링할지 여부를 결정합니다.

일치하는 첫 번째 샘플링 재정의만 사용됩니다.

샘플링 재정의가 일치하지 않는 경우:

  • 추적의 첫 번째 범위인 경우 최상위 샘플링 구성이 사용됩니다.
  • 추적의 첫 번째 범위가 아닌 경우 부모 샘플링 결정이 사용됩니다.

예: 상태 검사에 대한 원격 분석 수집 안 함

이 예제는 /health-checks에 대한 모든 요청의 원격 분석을 수집하지 않습니다.

이 예제는 또한 일반적으로 /health-checks에서 수집되는 다운스트림 범위(종속성)도 수집하지 않습니다.

{
  "connectionString": "...",
  "sampling": {
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          {
            "key": "url.path",
            "value": "/health-check",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }
}

예: 노이즈 종속성 호출에 대한 원격 분석 수집 안 함

이 예제는 모든 GET my-noisy-key Redis 호출에 대한 원격 분석을 수집하지 않습니다.

{
  "connectionString": "...",
  "sampling": {
    "overrides": [
      {
        "telemetryType": "dependency",
        "attributes": [
          {
            "key": "db.system",
            "value": "redis",
            "matchType": "strict"
          },
          {
            "key": "db.statement",
            "value": "GET my-noisy-key",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }
}

예: 중요한 요청 유형에 대한 원격 분석의 100% 수집

이 예제에서는 /login에 대한 원격 분석의 100%를 수집합니다.

다운스트림 범위(종속성)는 부모의 샘플링 결정(해당 다운스트림 범위에 대한 샘플링 재정의 제외)을 준수하므로 모든 ‘/login’ 요청에 대해서도 수집됩니다.

{
  "connectionString": "...",
  "sampling": {
    "percentage": 10
  },
  "sampling": {
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          {
            "key": "url.path",
            "value": "/login",
            "matchType": "strict"
          }
        ],
        "percentage": 100
      }
    ]
  }
}

샘플링에 사용할 수 있는 범위 특성

범위 특성 이름은 OpenTelemetry 의미 체계 규칙에 기반합니다. (HTTP, 메시징, 데이터베이스, RPC)

https://github.com/open-telemetry/semantic-conventions/blob/main/docs/README.md

참고 항목

Application Insights Java에서 애플리케이션용으로 캡처한 정확한 특성 집합을 보려면 자체 진단 수준을 디버그로 설정하고 "내보내기 범위" 텍스트로 시작하는 디버그 메시지를 찾습니다.

참고 항목

범위의 시작 부분에 설정된 특성만 샘플링에 사용할 수 있으므로 나중에 캡처되는 http.response.status_code 같은 특성 또는 요청 기간은 OpenTelemetry Java 확장을 통해 필터링할 수 있습니다. 다음은 요청 기간에 따라 범위를 필터링하는샘플 확장입니다.

예: SQL 종속성 호출을 표시하지 않는 범위 특성 노출

이 예제에서는 시끄러운 SQL 호출을 표시하지 않는 사용 가능한 특성을 찾는 환경을 안내합니다. 아래 쿼리는 지난 30일 동안의 다양한 SQL 호출 및 관련 레코드 수를 보여 줍니다.

dependencies
| where timestamp > ago(30d)
| where name == 'SQL: DB Query'
| summarize count() by name, operation_Name, data
| sort by count_ desc
SQL: DB Query    POST /Order             DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    36712549    
SQL: DB Query    POST /Receipt           DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    2220248    
SQL: DB Query    POST /CheckOutForm      DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    554074    
SQL: DB Query    GET /ClientInfo         DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    37064

위의 결과에서 모든 작업이 필드에서 DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;동일한 값을 data 공유하는 것을 관찰할 수 있습니다. 이러한 모든 레코드 간의 공통성은 샘플링 재정의에 적합한 후보입니다.

자체 진단을 디버그하도록 설정하면 다음 로그 항목이 출력에 표시됩니다.

2023-10-26 15:48:25.407-04:00 DEBUG c.m.a.a.i.exporter.AgentSpanExporter - exporting span: SpanData{spanContext=ImmutableSpanContext...

이러한 로그의 관심 영역은 "특성" 섹션입니다.

{
  "attributes": {
    "data": {
      "thread.name": "DefaultDatabaseBroadcastTransport: MessageReader thread",
      "thread.id": 96,
      "db.connection_string": "apache:",
      "db.statement": "DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;",
      "db.system": "other_sql",
      "applicationinsights.internal.item_count": 1
    }
  }
}

해당 출력을 사용하여 노이즈 SQL 호출을 필터링하는 아래와 유사한 샘플링 재정의를 구성할 수 있습니다.

{
  "connectionString": "...",
  "preview": {
    "sampling": {
      "overrides": [
        {
          "telemetryType": "dependency",
          "attributes": [
            {
              "key": "db.statement",
              "value": "DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;",
              "matchType": "strict"
            }
          ],
          "percentage": 0
        }
      ]
    }
  }
}

변경 내용이 적용되면 다음 쿼리를 통해 이러한 종속성이 Application Insights에 마지막으로 수집된 시간을 확인할 수 있습니다.

dependencies
| where timestamp > ago(30d)
| where data contains 'DECLARE @MyVar'
| summarize max(timestamp) by data
| sort by max_timestamp desc
DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    11/13/2023 8:52:41 PM 

문제 해결

regexp을(를) 사용하여 샘플링 재정의가 작동하지 않는 경우 .* 정규식을 사용해 보세요. 이제 샘플링이 작동하면 첫 번째 정규식에 문제가 있다는 의미이므로 이 정규식 설명서를 읽습니다.

.*이(가) 작동하지 않는 경우 application-insights.json file에 구문 문제가 있을 수 있습니다. Application Insights 로그를 살펴보고 경고 메시지가 표시되는지 확인하세요.