다음을 통해 공유


원격 분석 프로세서의 예 - Java용 Azure Monitor Application Insights

이 문서에서는 포함 및 제외 구성에 대한 샘플을 포함하여 Java용 Application Insights의 원격 분석 프로세서 예제를 제공합니다. 또한 특성 프로세서와 범위 프로세서에 대한 샘플도 있습니다.

범위 포함 및 제외 샘플

이 섹션에서는 범위를 포함하고 제외하는 방법을 알아봅니다. 또한 여러 범위를 제외하고 선택적 처리를 적용하는 방법도 알아봅니다.

범위 포함

이 섹션에서는 특성 프로세서의 범위를 포함하는 방법을 보여줍니다. 프로세서는 속성과 일치하지 않는 범위를 처리하지 않습니다.

일치하는 범위를 찾으려면 범위 이름이 spanA 또는 spanB와 동일해야 합니다.

이러한 범위는 include 속성과 일치하며 프로세서 작업이 적용됩니다.

  • Span1 이름: 'spanA' 특성: {env: dev, test_request: 123, credit_card: 1234}
  • Span2 이름: 'spanB' 특성: {env: dev, test_request: false}
  • Span3 이름: 'spanA' 특성: {env: 1, test_request: dev, credit_card: 1234}

이 범위는 include 속성과 일치하지 않으며 프로세서 작업이 적용되지 않습니다.

  • Span4 이름: 'spanC' 특성: {env: dev, test_request: false}
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "include": {
          "matchType": "strict",
          "spanNames": [
            "spanA",
            "spanB"
          ]
        },
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

범위 제외

이 섹션에서는 특성 프로세서의 범위를 제외하는 방법을 보여줍니다. 이 프로세서는 속성과 일치하는 범위를 처리하지 않습니다.

일치하는 범위를 찾으려면 범위 이름이 spanA 또는 spanB와 동일해야 합니다.

다음 범위는 exclude 속성과 일치하며 프로세서 작업은 적용되지 않습니다.

  • Span1 이름: 'spanA' 특성: {env: dev, test_request: 123, credit_card: 1234}
  • Span2 이름: 'spanB' 특성: {env: dev, test_request: false}
  • Span3 이름: 'spanA' 특성: {env: 1, test_request: dev, credit_card: 1234}

이 범위는 exclude 속성과 일치하지 않으며 프로세서 작업이 적용됩니다.

  • Span4 이름: 'spanC' 특성: {env: dev, test_request: false}
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "exclude": {
          "matchType": "strict",
          "spanNames": [
            "spanA",
            "spanB"
          ]
        },
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

여러 조건을 사용하여 범위 제외

이 섹션에서는 특성 프로세서의 범위를 제외하는 방법을 보여줍니다. 이 프로세서는 속성과 일치하는 범위를 처리하지 않습니다.

일치하는 범위를 찾으려면 다음 조건이 충족되어야 합니다.

  • 특성(예: dev 값이 있는 env)이 범위에 있어야 합니다.
  • 범위에는 test_request 키가 포함된 특성이 있어야 합니다.

다음 범위는 exclude 속성과 일치하며 프로세서 작업은 적용되지 않습니다.

  • Span1 이름: 'spanB' 특성: {env: dev, test_request: 123, credit_card: 1234}
  • Span2 이름: 'spanA' 특성: {env: dev, test_request: false}

다음 범위는 exclude 속성과 일치하지 않으므로 프로세서 작업이 적용됩니다.

  • Span3 이름: 'spanB' 특성: {env: 1, test_request: dev, credit_card: 1234}
  • Span4 이름: 'spanC' 특성: {env: dev, dev_request: false}
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "exclude": {
          "matchType": "strict",
          "spanNames": [
            "spanA",
            "spanB"
          ],
          "attributes": [
            {
              "key": "env",
              "value": "dev"
            },
            {
              "key": "test_request"
            }
          ]
        },
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

선택 처리

이 섹션에서는 이 프로세서가 적용되어야 하는 범위를 나타내는 범위 속성 집합을 지정하는 방법을 보여줍니다. include 속성은 어떤 범위를 처리해야 하는지 나타냅니다. exclude 속성은 처리되어서는 안 되는 범위를 필터링합니다.

다음 구성에서 이러한 범위는 속성과 일치하며 프로세서 작업이 적용됩니다.

  • Span1 이름: 'spanB' 특성: {env: production, test_request: 123, credit_card: 1234, redact_trace: "false"}
  • Span2 이름: 'spanA' 특성: {env: staging, test_request: false, redact_trace: true}

이러한 범위는 include 속성과 일치하지 않으며 프로세서 작업이 적용되지 않습니다.

  • Span3 이름: 'spanB' 특성: {env: production, test_request: true, credit_card: 1234, redact_trace: false}
  • Span4 이름: 'spanC' 특성: {env: dev, test_request: false}
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "include": {
          "matchType": "strict",
          "spanNames": [
            "spanA",
            "spanB"
          ]
        },
        "exclude": {
          "matchType": "strict",
          "attributes": [
            {
              "key": "redact_trace",
              "value": "false"
            }
          ]
        },
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          },
          {
            "key": "duplicate_key",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

특성 프로세서 샘플

삽입

다음 샘플은 새 {"attribute1": "attributeValue1"} 특성을 attribute1 키가 없는 범위와 로그에 삽입합니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "attribute1",
            "value": "attributeValue1",
            "action": "insert"
          }
        ]
      }
    ]
  }
}

다른 키에서 삽입

다음 샘플은 anotherkey 특성의 값을 사용하여 새 {"newKey": "<value from attribute anotherkey>"} 특성을 newKey 키가 없는 범위와 로그에 삽입합니다. anotherkey 특성이 없으면 범위와 로그에 새 특성이 삽입되지 않습니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "newKey",
            "fromAttribute": "anotherKey",
            "action": "insert"
          }
        ]
      }
    ]
  }
}

엽데이트

다음 샘플에서는 특성을 {"db.secret": "redacted"}로 업데이트합니다. 특성 foo의 값을 사용하여 boo 특성을 업데이트합니다. boo 특성이 없는 범위와 로그는 변경되지 않습니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "db.secret",
            "value": "redacted",
            "action": "update"
          },
          {
            "key": "boo",
            "fromAttribute": "foo",
            "action": "update" 
          }
        ]
      }
    ]
  }
}

삭제

다음 샘플에서는 credit_card 키가 있는 특성을 삭제하는 방법을 보여줍니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "credit_card",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

해시

다음 샘플에서는 기존 특성 값을 해시하는 방법을 보여줍니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "user.email",
            "action": "hash"
          }
        ]
      }
    ]
  }
}

추출

다음 샘플에서는 정규식(regex)을 사용하여 다른 특성 값을 기준으로 새 특성을 만드는 방법을 보여줍니다. 예를 들어 url.path = /path?queryParam1=value1,queryParam2=value2가 지정되면 다음 특성이 삽입됩니다.

  • httpProtocol: http
  • httpDomain: example.com
  • httpPath: path
  • httpQueryParams: queryParam1=value1,queryParam2=value2
  • url.path: 변경 없음
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "url.path",
            "pattern": "^(?<httpProtocol>.*):\\/\\/(?<httpDomain>.*)\\/(?<httpPath>.*)(\\?|\\&)(?<httpQueryParams>.*)",
            "action": "extract"
          }
        ]
      }
    ]
  }
}

마스크

예를 들어 지정된 url.path = https://example.com/user/12345622은(는) 아래 구성 중 하나를 사용하여 url.path = https://example.com/user/****로 업데이트됩니다.

첫 번째 구성 예제:

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "url.path",
            "pattern": "user\\/\\d+",
            "replace": "user\\/****",
            "action": "mask"
          }
        ]
      }
    ]
  }
}

정규식 그룹 이름을 가진 두 번째 구성 예제:

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "actions": [
          {
            "key": "url.path",
            "pattern": "^(?<userGroupName>[a-zA-Z.:\/]+)\d+",
            "replace": "${userGroupName}**",
            "action": "mask"
          }
        ]
      }
    ]
  }
}

문자열이 아닌 형식 특성 샘플

3.4.19 GA부터는 원격 분석 프로세서에서 문자열이 아닌 형식 특성인 boolean, double, long, boolean-array, double-array, long-array, string-array를 지원합니다.

JSON에 attributes.type이 제공되지 않으면 기본값은 string입니다.

다음 예에서는 특성이 {"longAttributeKey": 1234}{"booleanAttributeKey": true}{"doubleArrayAttributeKey": [1.0, 2.0, 3.0, 4.0]}에 일치하는 범위 및 로그에 새 {"newAttributeKeyStrict": "newAttributeValueStrict"} 특성을 삽입합니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "include": {
          "matchType": "strict",
          "attributes": [
            {
              "key": "longAttributeKey",
              "value": 1234,
              "type": "long"
            },
            {
              "key": "booleanAttributeKey",
              "value": true,
              "type": "boolean"
            },
            {
              "key": "doubleArrayAttributeKey",
              "value": [1.0, 2.0, 3.0, 4.0],
              "type": "double-array"
            }
          ]
        },
        "actions": [
          {
            "key": "newAttributeKeyStrict",
            "value": "newAttributeValueStrict",
            "action": "insert"
          }
        ],
        "id": "attributes/insertNewAttributeKeyStrict"
      }
    ]
  }
}

또한, 문자열이 아닌 형식의 특성은 regexp를 지원합니다.

다음 샘플에서는 longRegexpAttributeKey 특성이 400에서 499 사이의 값과 일치하는 범위 및 로그에 새 {"newAttributeKeyRegexp": "newAttributeValueRegexp"} 특성을 삽입합니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "attribute",
        "include": {
          "matchType": "regexp",
          "attributes": [
            {
              "key": "longRegexpAttributeKey",
              "value": "4[0-9][0-9]",
              "type": "long"
            }
          ]
        },
        "actions": [
          {
            "key": "newAttributeKeyRegexp",
            "value": "newAttributeValueRegexp",
            "action": "insert"
          }
        ],
        "id": "attributes/insertNewAttributeKeyRegexp"
      }
    ]
  }
}

범위 프로세서 샘플

범위 이름 지정

다음 샘플에서는 db.svc, operationid 특성 값을 지정합니다. :: 값으로 구분된 해당 특성을 순서대로 사용하여 범위의 새 이름을 지정합니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "span",
        "name": {
          "fromAttributes": [
            "db.svc",
            "operation",
            "id"
          ],
          "separator": "::"
        }
      }
    ]
  }
}

범위 이름에서 특성 추출

입력 범위 이름이 /api/v1/document/12345678/update라고 가정해 보겠습니다. 다음 샘플은 출력 범위 이름 /api/v1/document/{documentId}/update으로 표시됩니다. 새 documentId=12345678 특성을 범위에 추가합니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "span",
        "name": {
          "toAttributes": {
            "rules": [
              "^/api/v1/document/(?<documentId>.*)/update$"
            ]
          }
        }
      }
    ]
  }
}

include 및 exclude를 사용하여 범위 이름에서 특성을 추출합니다.

다음 샘플에서는 범위 이름을 {operation_website}로 변경하는 방법을 보여줍니다. 범위에 다음 속성이 있으면 operation_website 키와 {oldSpanName} 값이 있는 특성을 추가합니다.

  • 범위 이름의 문자열 아무 곳에 /가 포함됩니다.
  • 범위 이름은 donot/change가 아닙니다.
{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "span",
        "include": {
          "matchType": "regexp",
          "spanNames": [
            "^(.*?)/(.*?)$"
          ]
        },
        "exclude": {
          "matchType": "strict",
          "spanNames": [
            "donot/change"
          ]
        },
        "name": {
          "toAttributes": {
            "rules": [
              "(?<operation_website>.*?)$"
            ]
          }
        }
      }
    ]
  }
}

로그 프로세서 샘플

로그 메시지 본문에서 특성 추출

입력 로그 메시지 본문이 Starting PetClinicApplication on WorkLaptop with PID 27984 (C:\randompath\target\classes started by userx in C:\randompath)라고 가정해 보겠습니다. 다음 샘플은 출력 메시지 본문 Starting PetClinicApplication on WorkLaptop with PID {PIDVALUE} (C:\randompath\target\classes started by userx in C:\randompath)로 표시됩니다. 새 PIDVALUE=27984 특성을 로그에 추가합니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "log",
        "body": {
          "toAttributes": {
            "rules": [
              "^Starting PetClinicApplication on WorkLaptop with PID (?<PIDVALUE>\\d+) .*"
            ]
          }
        }
      }
    ]
  }
}

로그 메시지의 중요한 데이터 마스킹

다음 샘플에서는 로그 프로세서와 특성 프로세서를 모두 사용하여 로그 메시지 본문에서 중요한 데이터를 마스킹하는 방법을 보여줍니다. 입력 로그 메시지 본문이 User account with userId 123456xx failed to login이라고 가정해 보겠습니다. 로그 프로세서는 출력 메시지 본문을 User account with userId {redactedUserId} failed to login으로 업데이트하며 특성 프로세서는 이전 단계에서 추가한 새 redactedUserId 특성을 삭제합니다.

{
  "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000",
  "preview": {
    "processors": [
      {
        "type": "log",
        "body": {
          "toAttributes": {
            "rules": [
              "userId (?<redactedUserId>[0-9a-zA-Z]+)"
            ]
          }
        }
      },
      {
        "type": "attribute",
        "actions": [
          {
            "key": "redactedUserId",
            "action": "delete"
          }
        ]
      }
    ]
  }
}

자주 묻는 질문

TelemetryClient.trackTrace()를 사용하여 로그 프로세서가 로그 파일을 처리하지 않는 이유는 무엇인가요?

TelemetryClient.trackTrace()는 Application Insights 클래식 SDK 브리지의 일부이며 로그 프로세서는 새 OpenTelemetry 기반 계측에서만 작동합니다.