Compartilhar via


Exemplos de processador de telemetria – Application Insights do Azure Monitor para Java

Este artigo fornece exemplos de processadores de telemetria no Application Insights para Java, incluindo exemplos de configurações de inclusão e exclusão. Ele também inclui exemplos para processadores de atributo e processadores de intervalo.

Incluir e excluir exemplos de intervalo

Nesta seção, descubra como incluir e excluir intervalos. Você também aprenderá como excluir vários intervalos e aplicar o processamento seletivo.

Incluir intervalos

Esta seção mostra como incluir intervalos para um processador de atributo. O processador não processa intervalos que não correspondem às propriedades.

Uma correspondência requer que o nome de do intervalo seja igual a spanA ou spanB.

Estes intervalos correspondem às propriedades include, e as ações do processador são aplicadas:

  • Nome de Span1: 'spanA' Atributos: {env: dev, test_request: 123, credit_card: 1234}
  • Nome de Span2: 'spanB' Atributos: {env: dev, test_request: false}
  • Nome de Span3: 'spanA' Atributos: {env: 1, test_request: dev, credit_card: 1234}

Esse intervalo não corresponde às propriedades include, e as ações do processador não são aplicadas:

  • Span4 Name: 'spanC' Attributes: {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"
          }
        ]
      }
    ]
  }
}

Excluir intervalos

Esta seção demonstra como excluir intervalos para um processador de atributo. Esse processador não processa intervalos que correspondam às propriedades.

Uma correspondência requer que o nome de do intervalo seja igual a spanA ou spanB.

Os seguintes intervalos correspondem às propriedades exclude, e as ações do processador não são aplicadas:

  • Nome de Span1: 'spanA' Atributos: {env: dev, test_request: 123, credit_card: 1234}
  • Nome de Span2: 'spanB' Atributos: {env: dev, test_request: false}
  • Nome de Span3: 'spanA' Atributos: {env: 1, test_request: dev, credit_card: 1234}

Este intervalo não corresponde às propriedades exclude, e as ações do processador são aplicadas:

  • Span4 Name: 'spanC' Attributes: {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"
          }
        ]
      }
    ]
  }
}

Excluir intervalos usando vários critérios

Esta seção demonstra como excluir intervalos para um processador de atributo. Esse processador não processa intervalos que correspondam às propriedades.

Uma correspondência requer que as seguintes condições sejam atendidas:

  • Um atributo (por exemplo, env com valor dev) precisa existir no intervalo.
  • O intervalo deve ter um atributo que tenha a chave test_request.

Os intervalos a seguir correspondem às propriedades exclude, e as ações do processador não são aplicadas.

  • Nome de Span1: 'spanB' Atributos: {env: dev, test_request: 123, credit_card: 1234}
  • Nome de Span2: 'spanA' Atributos: {env: dev, test_request: false}

O seguinte intervalo não corresponde às propriedades exclude, e as ações do processador são aplicadas:

  • Nome de Span3: 'spanB' Atributos: {env: 1, test_request: dev, credit_card: 1234}
  • Span4 Name: 'spanC' Attributes: {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"
          }
        ]
      }
    ]
  }
}

Processamento seletivo

Esta seção mostra como especificar o conjunto de propriedades de intervalo que indicam a quais intervalos esse processador deve ser aplicado. As propriedades include indicam quais intervalos devem ser processados. As propriedades exclude filtram intervalos que não devem ser processados.

Na seguinte configuração, esses intervalos correspondem às propriedades, e as ações do processador são aplicadas:

  • Nome de Span1: 'spanB' Atributos: {env: production, test_request: 123, credit_card: 1234, redact_trace: "false"}
  • Nome de Span2: 'spanA' Atributos: {env: staging, test_request: false, redact_trace: true}

Estes intervalos não correspondem às propriedades include, e as ações do processador não são aplicadas:

  • Nome de Span3: 'spanB' Atributos: {env: production, test_request: true, credit_card: 1234, redact_trace: false}
  • Span4 Name: 'spanC' Attributes: {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"
          }
        ]
      }
    ]
  }
}

Exemplos de processador de atributos

Inserir

O exemplo a seguir insere o novo atributo {"attribute1": "attributeValue1"} em intervalos e registra onde a chave attribute1 não existe.

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

Fazer inserção de outra chave

O exemplo a seguir usa o valor do atributo anotherkey para inserir o novo atributo {"newKey": "<value from attribute anotherkey>"} em intervalos e registra onde a chave newKey não existe. Se o atributo anotherkey não existir, nenhum novo atributo será inserido em intervalos e logs.

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

Atualização

O exemplo a seguir atualiza o atributo para {"db.secret": "redacted"}. Ele atualiza o atributo boo usando o valor do atributo foo. Os intervalos e os logs que não têm o atributo boo não mudam.

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

Excluir

O exemplo a seguir mostra como excluir um atributo que tem a chave credit_card.

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

Hash

O exemplo a seguir mostra como realizar hash de valores de atributo existentes.

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

Extract

O exemplo a seguir mostra como usar uma regex (expressão regular) para criar atributos com base no valor de outro atributo. Por exemplo, dado url.path = /path?queryParam1=value1,queryParam2=value2, os seguintes atributos são inseridos:

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

Máscara

Por exemplo, dado que url.path = https://example.com/user/12345622 é atualizado para url.path = https://example.com/user/**** usando qualquer uma das configurações abaixo.

Primeiro exemplo de configuração:

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

Segundo exemplo de configuração com o nome do grupo de expressões regulares:

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

Amostras de atributos com tipo que não são cadeias de caracteres

A partir da versão 3.4.19 GA, os processadores de telemetria dão suporte a atributos com tipo que não são cadeias de caracteres: boolean, double, long, boolean-array, double-array, long-array e string-array.

Quando attributes.type não é fornecido no json, ele usa string por padrão.

O exemplo a seguir insere o novo atributo {"newAttributeKeyStrict": "newAttributeValueStrict"} em períodos e registros em que os atributos correspondem aos seguintes exemplos: {"longAttributeKey": 1234}{"booleanAttributeKey": true}{"doubleArrayAttributeKey": [1.0, 2.0, 3.0, 4.0]}

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

Além disso, os atributos com tipo que não são cadeias de caracteres dão suporte para regexp.

O exemplo a seguir insere o novo atributo {"newAttributeKeyRegexp": "newAttributeValueRegexp"} em períodos e registros em que o atributo longRegexpAttributeKey corresponde ao valor de 400 a 499.

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

Exemplos de processador de intervalo

Dar nome a um intervalo

O exemplo a seguir especifica os valores dos atributos db.svc, operation e id. Ele forma o novo nome do intervalo usando esses atributos, nessa ordem, separados pelo valor ::.

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

Extrair atributos do nome de um intervalo

Vamos supor que o nome do intervalo de entrada seja /api/v1/document/12345678/update. O exemplo a seguir resulta no nome do intervalo de saída /api/v1/document/{documentId}/update. Ele adiciona o novo atributo documentId=12345678 ao intervalo.

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

Extrair atributos de um nome de intervalo usando incluir e excluir

O exemplo a seguir mostra como alterar o nome do intervalo para {operation_website}. Ele adiciona um atributo com a chave operation_website e o valor {oldSpanName} quando o intervalo tem as seguintes propriedades:

  • O nome do intervalo contém / em qualquer lugar na cadeia de caracteres.
  • O nome do intervalo não é 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>.*?)$"
            ]
          }
        }
      }
    ]
  }
}

Exemplos de processador de log

Extrair atributos do corpo de uma mensagem de log

Vamos supor que o corpo da mensagem do log de entrada seja Starting PetClinicApplication on WorkLaptop with PID 27984 (C:\randompath\target\classes started by userx in C:\randompath). O exemplo a seguir resulta no corpo da mensagem de saída Starting PetClinicApplication on WorkLaptop with PID {PIDVALUE} (C:\randompath\target\classes started by userx in C:\randompath). Ele adiciona o novo atributo PIDVALUE=27984 ao log.

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

Como mascarar dados confidenciais na mensagem do log

O exemplo a seguir mostra como mascarar dados confidenciais em um corpo de mensagem do log usando o processador de log e o processador de atributo. Vamos supor que o corpo da mensagem do log de entrada seja User account with userId 123456xx failed to login. O processador de log atualiza o corpo da mensagem de saída para User account with userId {redactedUserId} failed to login e o processador de atributo exclui o novo atributo redactedUserId que estava adicionando na etapa anterior.

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

Perguntas frequentes

Por que o processador de logs não processa arquivos de log usando TelemetryClient.trackTrace()?

TelemetryClient.trackTrace() faz parte da ponte do SDK Clássico do Application Insights e os processadores de log só funcionam com a nova instrumentação baseada em OpenTelemetry.