Receber e armazenar relatórios agregáveis

Este guia descreve como os relatórios de medição criptografados são enviados aos provedores de adtech. Os navegadores e clientes do Chrome enviam esses relatórios para endpoints de relatórios designados, onde a plataforma de adtech recebe e armazena relatórios agregáveis. Esses endpoints, localizados em URLs .well-known na origem de relatórios do provedor, são hospedados pela plataforma, permitindo que os provedores de adtech usem a API Attribution Reporting ou a API Private Aggregation para acessá-los.

O processo de recebimento e armazenamento de relatórios agregáveis no serviço de agregação do Sandbox de privacidade.
Figura 1.Serviço de agregação: processamento de relatórios agregáveis.

As etapas a seguir detalham o processo do serviço de agregação para receber e armazenar relatórios agregáveis:

  1. Quando acionado, o navegador envia relatórios agregáveis com detalhes sobre dados de conversão e entre sites.
  2. O navegador envia os relatórios criptografados para um URL .well-known no domínio de relatórios da adtech.
  3. O sistema encaminha os lotes de relatórios para o serviço de agregação para processamento.
  4. O serviço de agregação resume os relatórios estatisticamente.
  5. O serviço de agregação adiciona ruído aos dados resumidos para melhorar a privacidade do usuário.
  6. O sistema disponibiliza os relatórios à empresa de adtech para fins de análise e medição.

A tabela a seguir descreve os endpoints de depuração e em tempo real da API Private Aggregation e da API Attribution Reporting:

API Endpoint Descrição
API Private Aggregation
Endpoint de depuração:
[reporting-origin]/.well-known/private-aggregation/debug/report-shared-storage
Endpoints ativos:
  • [reporting-origin]/.well-known/private-aggregation/report-shared-storage
  • [reporting-origin]/.well-known/private-aggregation/report-protected-audience
Endpoint de depuração:
Para desenvolvimento e teste da API Private Aggregation.
Endpoints ativos:
Recebe e processa relatórios de medição em ambientes ativos
API Attribution Reporting
Endpoint de depuração:
[reporting-origin]/.well-known/attribution-reporting/debug/report-aggregate-attribution
Endpoint ativo:
[reporting-origin]/.well-known/attribution-reporting/report-aggregate-attribution
Endpoint de depuração:
Para desenvolvimento e testes da API Attribution Reporting.
Endpoints ativos:
  • Endpoint de produção para relatórios de atribuição agregados.
  • Recebe e processa relatórios de atribuição agregados em ambientes de produção em tempo real para medição.

As origens de relatórios recebem relatórios JSON por chamadas POST. Em seguida, o sistema transforma esses relatórios no formato Avro e os coloca no armazenamento em nuvem. Após o processamento em lote, o sistema envia os relatórios do Avro para o serviço de agregação para resumo.

As plataformas de adtech acionam uma solicitação de job de agregação para o serviço de agregação quando um lote de relatórios do Avro está pronto para processamento. Esse serviço, hospedado no ambiente de nuvem da plataforma de adtech, recupera os relatórios Avro necessários do mesmo local de armazenamento. Por motivos de segurança, o serviço de agregação precisa ser configurado para usar uma imagem de contêiner aprovada. Consulte o repositório do GitHub para sandbox de privacidade/serviço de agregação para conferir as imagens de contêiner disponíveis.

Confira a seguir exemplos representativos dos relatórios retornados por cada API:

  • Exemplo de relatório da API Private Aggregation:
  {
    "aggregation_coordinator_origin": "https://publickeyservice.msmt.aws.privacysandboxservices.com",
    "aggregation_service_payloads": [ {
        "key_id": "1a2baa3f-5d48-46cf-91f0-772633c12640",
        "payload": "8Cjr1s3FVkCYkjzBvyzJn14yardVjd5N4vLCA69LQAPbIkJ0B58hAqUGBCNXpvTjW9ZpIoZbCSiUOsUDuoA/S+tqVolLMkame6sWC07cfUmZcVsbU+La3pzTMtCgdtNc8MIWgD3C63CMw7rWroRlechewVUajvAYVK/0HJq0YyGrTiFZZm36zi0jjyHLAXKV8p1Lvy1d0o/wnBxC5oVo5BV6LPkxqQEcoYS2GyixUuht6wD0RzuH+BxxuH6vY/ynp2xDrnwftjvqwDUAxUWLFTunthM6BXZVxlrvOBim1h2dvPqWSyKZ5gafo+MgW9EM4SraavNM3XzZSCjdtAfSMJMrynSu2j0opyAq+9e1jq1xeYN00yZrJ0Y/GTI45IGjgCnVmvmuoI9ucW2SnXP31CQBwHqk4gtUgMsYGFSUYfhtnAQ/8TSbaXyS2LX+cQW87LqkvIraWw6o37O24VFBreFoFFXpu3IUeCZfji+Sr4/ykfZuHeMzQbBavyNnHKzPZlbLSXMiucx4/vWzYyOzHeIlbtupXVvbi40V2PieDShaSbjI266kGgFkeCk6z51AaAGebDPtRT1lhBpcoQ6JdF0Yp5VWSnyFARKFtCZ1aEBrlUlrEHLUQY/pFtmDxJQiicRz1YPjR8jRr3C7hlRhWwov0dMocqnMz5209hHGVZWSsaGc9kWjtxREW2ULXfoIwOGbX+WZsyFW2RhXksQPJ5fhyNc4ROkAzUthLb68gC5e0yZHvmLIAU4hcWe0UanJv+jRljn8PAPaJHKFUxQNJyBA7mTbn5mkpycxGrX6T3ZYdPHqvckqt9llJZWjr8NneizzZFRuJk423BDs38fXkvcTAsAckd2Zu0u2KC45WR93sN2/CWrqB7/QU9BsgNdonl/ehAWhU1LbcRRvBTcR9+0wL7vRL7cv5LG3+gRYRKsWI6U2nDSWp0cNpo9+HU0JNiifa5X0cguihqU2bSk6ABozgRtCZ7m+7eqWXMLSzBdmc1CPUoQppo6Wmf6ujdNqI6v2S6pDH781lph8Z2v7ZpxGdhVVPEL51cVn"
    } ],
    "debug_key": "1234",
    "shared_info": "{\"api\":\"shared-storage\",\"report_id\":\"05e3b948-cb8d-4404-be29-bfeac7ad9710\",\"reporting_origin\":\"https://privacy-sandbox-demos-dsp.dev\",\"scheduled_report_time\":\"1707784729\",\"version\":\"0.1\"}"
  }
  • Exemplo de relatório da API Attribution Reporting
  {
    "aggregation_coordinator_origin": "https://publickeyservice.msmt.aws.privacysandboxservices.com",
    "aggregation_service_payloads": [ {
        "key_id": "2dee0f3f-2aee-4a4a-8238-9154ed3d6f72",
        "payload": "pHvTHhcxvNKaCmnLpvYQsXlJpiNRuFO5Zj1QqUlqgWPOfuoHLfiXiFjmpvY8a53/OYnS4bKwHwJReFcofldsu8E9BzTTJ3CEk+B7vbEjnDPaljhpIBMTuQXy3QHGK4slWR/yNZVm2uXRWR/DVVzXziBoTDjN7qaPstRoLKUUMdfY2u8oq4tnLY00Y+NDZttZ4wJvC7hPmvY3lqHjdl14JPD2ytZZ4NViYzno3WKdH/oZc0jhGK4zI38lAM0qpahF/B9yb4zOu7IRIjQpNx73P8naDyddxLldoVlW/qHpO04FguWymscvI/8i6NwUR6Kj8seRlWS0iIUhETt/ai3lilKUHUb+uz0YG2kxjoXq7Ldk+MP56nNl67ZRNi2YZ7bOGI/okYWoT/wt2uWPe/5xAEMmadxl0hQQrG7YXHRSD8rDnaVPXo+AKIxdg727yJeB1ZENZvovl/kIevdRAmdBe2h1U3J6Uz6psly/46fvjgkj5QD+kO2uaYirzvmwS19luJsN/Qvh/R3ZO4qlJIQI0nDJPWwUJ4ODpyVmj4a0xQp3t2ESEnf4EmY7+khn3xpF5+MwEWKES2ZeDf7SHalR99pvZA8G3Fr8M0PWFmT00cmKCBwpQgZyd3Eay70UlqdkbFEedxiCVWKNNOUz41m5KG/7K3aR+dYx57l57Wct4gOFQg3jiUEBJWrFIVCXf12BT5iz5rBQh1N1CUt2oCOhYL/sPuBl6OV5GWHSIj8FUdpoDolqKXWINXfE88MUijE2ghNRpJN25BXIErUQtO9wFQv7zotC6d2BIaF0x8AkKg/7yzBQRySX/FZP3H3lMkpOz9rQMV8DjZ2lz7nV4k6CFo8qhT6cpYJD7GpYl81xJbglNqcJt5Pe5YUHrdBMyAFsTh3yoJvYnhQib/0xVN/a93lbYccxsd0yi375n4Xz0i1HUoe2ps+WlU8XysAUA1agG936eshaY1anTtbJbrcoaH+BNSacKiq4saprgUGl4eDjaR/uBhvUnO52WkmAGon8De3EFMZ/kwpPBNSXi7/MIAMjotsSKBc19bfg"
    } ],
    "shared_info": "{\"api\":\"attribution-reporting\",\"attribution_destination\":\"https://privacy-sandbox-demos-shop.dev\",\"report_id\":\"5b052748-f5fb-4f14-b291-de03484ed59e\",\"reporting_origin\":\"https://privacy-sandbox-demos-dsp.dev\",\"scheduled_report_time\":\"1707786751\",\"source_registration_time\":\"0\",\"version\":\"0.1\"}",
    "source_debug_key": "123456789",
    "trigger_debug_key": "123456789"
  }

Converter JSON em relatórios Avro

Os relatórios agregáveis precisam estar no formato de serialização de dados do Apache Avro para fins de lote. Para criar um relatório do Avro, você precisa usar um esquema AVSC. O arquivo de esquema AVSC define a estrutura e o tipo de dados do registro do Avro. Para conferir um exemplo de esquema AVSC, consulte o arquivo example.avsc neste repositório do GitHub avrodoc/schemata.

Você pode encontrar um exemplo de código JavaScript na seção Collect, transform and batch reports da página Collecting and Batching Aggregatable Reports, localizada no repositório do GitHub privacysandbox/aggregation-service.

Você tem a flexibilidade de armazenar todos os relatórios em um único arquivo AVRO ou distribuí-los em vários arquivos. Embora os arquivos AVRO não tenham limite de tamanho, o desempenho ideal geralmente é alcançado quando o número de arquivos varia de acordo com o número de CPUs na instância da nuvem, até 1.000.

O exemplo de código a seguir mostra um esquema Avro para relatórios agregáveis. Os campos do relatório incluem payload, key_id e shared_info.

  {
    "type": "record",
    "name": "AggregatableReport",
    "fields": [
      {
        "name": "payload",
        "type": "bytes"
      },
      {
        "name": "key_id",
        "type": "string"
      },
      {
        "name": "shared_info",
        "type": "string"
      }
    ]
  }
Parâmetro Tipo Descrição
payload Bytes O payload precisa ser decodificado em base64 e convertido em uma matriz de bytes para relatórios em tempo real ou de produção.
debug_cleartext_payload Bytes O payload precisa ser decodificado em base64 e convertido em uma matriz de bytes do debug_cleartext_payload para relatórios de depuração.
key_id String Esta é a string key_id encontrada no relatório. O key_id é um identificador universalmente exclusivo de 128 bits.
shared_info String Essa é a string original e não adulterada encontrada no campo shared_info do relatório.

Confira a seguir um exemplo de relatório JSON:

{
   "aggregation_coordinator_identifier": "aws-cloud",
   "aggregation_service_payloads": [{
      "debug_cleartext_payload": "omRkYXhgaJldmFsdWVEAAAAgGZidWNrZXRQAAAAAAAAAAAAAAAAAAAFWW1vcGVyYX",
      "key_id": "3c6e2850-edf6-4886-eb70-eb3f2a7a7596",
      "payload": "oapYz92Mb1yam9YQ2AnK8dduTt2RwFUSApGcKqXnG1q+aGXfJ5DGpSxMj0NxdZgp7Cq"
   }],
   "debug_key": "1234",
   "shared_info":
"{\"api\":\"shared-storage\",\"debug_mode\":\"enabled\",\"report_id\":\"b029b922-93e9-4d66-a8c6-8cdeec762aed\",\"reporting_origin\":\"https://privacy-sandbox-demos-dsp.dev\",\"scheduled_report_time\":\"1719251997\",\"version\":\"0.1\"}"
}

Especificação do arquivo de domínio

A geração de relatórios de resumo com o serviço de agregação exige relatórios agregáveis (relatórios JSON convertidos em Avro) e o arquivo de domínio associado. O sistema extrai as chaves predeclaradas dos relatórios agregáveis e as inclui nos relatórios de resumo nos domínios de saída. Confira detalhes sobre essas chaves de agregação importantes em Como entender as chaves de agregação para relatórios de atribuição e na seção Chave de agregação de Noções básicas da API Private Aggregation. O domínio de saída também inclui o campo bucket, que representa o valor da chave do bucket.

O arquivo de domínio precisa estar no formato Avro usando o seguinte esquema:

  {
    "type": "record",
    "name": "AggregationBucket",
    "fields": [
      {
        "name": "bucket",
        "type": "bytes",
        "doc": "A single bucket that appears in the aggregation service output. It is an 128-bit integer value encoded as a 16-byte big-endian bytestring."
      }
    ]
  }

Chave do bucket

A chave do bucket no domínio de saída precisa ser representada como uma string de byte hexadecimal.

Exemplo:

Se a chave do bucket for o valor decimal 1369:

  1. Converta 1369 no equivalente hexadecimal: 559

  2. Converta a string hexadecimal "559" em uma string de bytes.

Essa representação de string de byte da chave do bucket precisa ser incluída no esquema Avro do domínio de saída.

Considerações importantes:

  • Tipo de dados: a chave do bucket no esquema do Avro precisa ser definida como um tipo de byte para acomodar a representação da string de byte hexadecimal.

  • Conversão: a conversão de decimal para hexadecimal e, em seguida, para uma string de bytes pode ser implementada usando Python ou Java.

Essa abordagem garante que a chave do bucket seja formatada corretamente e compatível com o tipo de dados esperado no esquema do Avro para o domínio de saída.

A chave do bucket precisa ser uma string de bytes hexadecimal. Por exemplo, considere uma string de byte com um valor decimal de 1369. Quando convertido para o formato Hex, é 559 para adição no domínio de saída do Avro.
Figura 2.O diagrama ilustra a transformação de uma chave de bucket em uma representação hexadecimal e de string de bytes, que é usada para preencher um esquema AVRO de domínio de saída.

Relatórios em lote

Para mais detalhes sobre os orçamentos de privacidade e as estratégias de agrupamento, consulte a documentação sobre estratégias de agrupamento. Os relatórios agregáveis têm um limite de MAX_REPORT_AGE (atualmente 90 dias) entre a scheduled_report_time e a data de execução do lote.

Relatórios de resumo

Após o agrupamento, o serviço de agregação cria o relatório de resumo no formato Avro usando o esquema results.avsc.

Após a conclusão do job, o relatório de resumo é armazenado no output_data_blob_prefix no bucket output_data_bucket_name, conforme especificado na solicitação createJob.

Para lotes do serviço de agregação em que debug_run está ativado, são criados dois relatórios: o de resumo e o de depuração. O relatório de resumo de depuração está localizado na pasta output_data_blob_prefix/debug. O relatório de resumo de depuração usa o esquema debug_results.avsc.

O resumo e o relatório de depuração são nomeados como [output_data_blob_prefix]-1-of-1.avro. Se o output_data_blob_prefix for summary/summary.avro, o relatório estará na pasta de resumo com o nome summary-1-of-1.avro.

Exemplo de results.avsc

Confira a seguir um exemplo de esquema Avro para results.avsc:

{
  "type": "record",
  "name": "AggregatedFact",
  "fields": [
    {
      "name": "bucket",
      "type": "bytes",
      "doc": "Histogram bucket used in aggregation. It is an 128-bit integer value encoded as a 16-byte big-endian bytestring. Leading 0-bits are left out."
    },
    {
      "name": "metric",
      "type": "long",
      "doc": "The metric associated with the bucket"
    }
  ]
}

O exemplo de esquema Avro define um registro chamado AggregatedFact.

Exemplo de debug_results.avsc

Confira a seguir um exemplo de esquema Avro para debug_results.avsc:

  {
  "type": "record",
  "name": "DebugAggregatedFact", Output domains include summary reports that contain pre-declared keys extracted from your aggregatable reports.
  "fields": [
      {
        "name": "bucket",
        "type": "bytes",
        "doc": "This represents the histogram bucket used in aggregation. It's a 128-bit integer, encoded as a 16-byte big-endian bytestring, with leading zero bytes omitted.."
      },
      {
        "name": "unnoised_metric",
        "type": "long",
        "doc": "The raw metric for the bucket."
      },
      {
        "name": "noise",
        "type": "long",
        "doc": "The noise applied to the metric in the regular result."
      }
      {
        "name":"annotations",
        "type": {
          "type": "array",
          "items": {
            "type":"enum",
            "name":"bucket_tags",
            "symbols":["in_domain","in_reports"]
          }
       }
    ]
  }

Após a conversão, o relatório de resumo vai ficar parecido com o exemplo results.json. Quando o debug_run está ativado, o retorno do relatório de resumo de depuração é semelhante ao exemplo de debug_results.json.

Formato dos relatórios do Avro

Os relatórios do Avro recebidos do serviço de agregação geralmente seguem um formato consistente. O formato do relatório Avro inclui os seguintes campos:

  • bucket: um identificador exclusivo para a agregação de dados (por exemplo, "\u0005Y").

  • métrica: o valor agregado do bucket correspondente. Esse valor geralmente inclui ruídos adicionados para melhorar a privacidade.

    Exemplo:

  {
    "bucket": "\u0005Y",
    "metric": 26308
  }

Exemplo de debug_results.json

Os relatórios de depuração do Avro do serviço de agregação serão semelhantes ao exemplo de debug_results.json a seguir. Esses relatórios incluem chaves de bucket, o unnoised_metric (resumo das chaves de bucket antes da aplicação do ruído) e o ruído adicionado a essa métrica.

  {
    "bucket": "\u0005Y",
    "unnoised_metric": 128,
    "noise": -17948,
    "annotations": [
      "in_reports",
      "in_domain"
    ]
  }

As anotações também contêm os seguintes valores:

  • in_reports: a chave do bucket disponível nos relatórios agregáveis

  • in_domain: a chave do bucket disponível no arquivo Avro output_domain