Otrzymywanie raportów zbiorczych do sklepu

Gdy dostawcy technologii reklamowych wywołują interfejsy API pomiarów (Attribution Reporting API lub Private Aggregation API), zaszyfrowane raporty są wysyłane z przeglądarki Chrome / po stronie klienta do punktu końcowego raportowania dostawcy technologii reklamowej, który jest .well-known adresem URL z pochodzeniem raportowania dostawcy technologii reklamowej. Punkt końcowy raportowania jest hostowany przez dostawcę technologii reklamowej w celu zbierania zaszyfrowanych raportów.

Diagram raportu AgS.
Diagram raportu AgS.

Oto punkty końcowe poszczególnych interfejsów API:

  • Agregacja prywatna

    • Debuguj [reporting-origin]/.well-known/private-aggregation/debug/report-shared-storage
    • Na żywo [reporting-origin]/.well-known/private-aggregation/report-shared-storage lub /.well-known/private-aggregation/report-protected-audience
  • Raporty atrybucji

    • Debuguj [reporting-origin]/.well-known/attribution-reporting/debug/report-aggregate-attribution
    • Na żywo o [reporting-origin]/.well-known/attribution-reporting/report-aggregate-attribution

Technologie reklamowe będą otrzymywać raporty w formacie JSON za pomocą wywołania POST. Dostawcy technologii reklamowych będą zbierać te raporty w formacie JSON, a następnie przekształcać je w format AVRO, który jest używany w usłudze agregacji. Po przekonwertowaniu raporty AVRO są przechowywane w miejscu w chmurze platformy reklamowej, aby można je było później grupować.

Gdy dostawca technologii reklamowej będzie gotowy do przetwarzania wsadowego, wyśle do usługi agregującej żądanie zadania agregacji, w ramach którego raporty zostaną pobrane z pamięci w chmurze dostawcy technologii reklamowej. Usługa do agregacji jest hostowana w pamięci w chmurze dostawcy technologii reklamowych i powinna mieć obraz na liście dozwolonych.

Otrzymane zgłoszenia wyglądają podobnie do tego:

Private Aggregation API

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

Attribution Reporting API.

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

Konwertowanie raportów JSON na AVRO

W przypadku przetwarzania wsadowego raporty podlegające agregacji muszą być w formacie AVRO. Aby utworzyć raport AVRO, potrzebujesz schematu AVRO raportu (AVSC).

Przykładowy kod JavaScript jest dostępny w repozytorium GitHub usługi Aggregation Service.

Poniżej znajduje się schemat AVRO dla raportów z możliwością agregacji. Różne pola w raportach to payload, key_idshared_info.

  {
    "type": "record",
    "name": "AggregatableReport",
    "fields": [
      {
        "name": "payload",
        "type": "bytes"
      },
      {
        "name": "key_id",
        "type": "string"
      },
      {
        "name": "shared_info",
        "type": "string"
      }
    ]
  }
Parametr Typ Opis
payload Bajty Ładunek musi zostać zdekodowany w formacie base64 i przekonwertowany na tablicę bajtów z payload w przypadku raportów na żywo lub produkcyjnych.
debug_cleartext_payload Bajty W przypadku raportów debugowania ładunek będzie musiał zostać zdekodowany w formacie Base64 i przekonwertowany na tablicę bajtów z debug_cleartext_payload.
key_id Ciąg znaków Będzie to ciąg znaków key_id znaleziony w raporcie. Identyfikator key_id będzie 128-bitowym unikalnym identyfikatorem uniwersalnym.
shared_info Ciąg znaków Będzie to niezmodyfikowany ciąg znaków znaleziony w polu shared_info raportu.

Oto przykładowy plik JSON raportu:

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

Wyjściowy plik AVRO domeny

Aby generować raporty podsumowujące za pomocą usługi do agregacji, platforma reklamowa musi mieć raporty podlegające agregacji i plik domeny. Raporty z możliwością agregacji to raporty JSON otrzymane w źródle raportowania i przekonwertowane na format AVRO. Domeny wyjściowe będą zawierać wstępnie zadeklarowane klucze, które będą zbierane z raportów z możliwością agregacji i zapisywane w raportach podsumowujących. Dowiedz się więcej o tych kluczach w raportowaniu atrybucjikluczach w Private Aggregation. Domena wyjściowa będzie zawierać pole koszyka, a wartość koszyka będzie kluczem koszyka.

Plik domeny musi być też w formacie AVRO i zawierać ten schemat:

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

Klucz zasobnika

Klucz zasobu powinien być szesnastkowym ciągiem bajtów klucza zasobu. Przykładem może być klucz o wartości 1369 w systemie dziesiętnym. Po przekonwertowaniu na format szesnastkowy będzie to 559. Następnie musisz przekonwertować liczbę 559 na ciąg bajtów, aby dodać go do domeny wyjściowej AVRO.

Diagram klucza zasobnika AgS.
Diagram klucza zasobnika AgS.

Raporty zbiorcze

Więcej informacji o budżetach na potrzeby prywatności i grupowaniu znajdziesz w dokumencie dotyczącym strategii grupowania. Pamiętaj też, że raportu z możliwością agregacji można grupować tylko w określonym czasie. Raport nie powinien przekraczać wartości MAX_REPORT_AGE między datą scheduled_report_time a datą uruchomienia przetwarzania wsadowego (obecnie 90 dni).

Raporty podsumowujące

Po utworzeniu partii usługa do agregacji tworzy raport podsumowujący w formacie AVRO. Raport podsumowujący korzysta ze schematu results.avsc.

Raport podsumowujący będzie się znajdować w output_data_blob_prefixoutput_data_bucket_name określonym w createJob.

W przypadku partii usługi do agregacji, w których włączono debug_run, tworzy 2 raporty. Raport podsumowujący i raport podsumowujący debugowanie. Raport podsumowujący debugowanie będzie się znajdować w folderze output_data_blob_prefix/debug.

Wygenerowany raport debugowania korzysta ze schematu debug_results.avsc.

Zarówno raport z podsumowaniem, jak i raport debugowania będą miały nazwę [output_data_blob_prefix]-1-of-1.avro. Jeśli wartość parametru output_data_blob_prefix to summary/summary.avro, raport będzie się znajdować w folderze podsumowania pod nazwą summary-1-of-1.avro.

results.avsc

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

debug_results.avsc

  {
  "type": "record",
  "name": "DebugAggregatedFact",
  "fields": [
      {
        "name": "bucket",
        "type": "bytes",
        "doc": "Histogram bucket used in aggregation. 128-bit integer encoded as a 16-byte big-endian bytestring. Leading 0-bits will be left out."
      },
      {
        "name": "unnoised_metric",
        "type": "long",
        "doc": "Unnoised metric associated with 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"]
          }
       }
    ]
  }

Po przekształceniu raport podsumowujący będzie wyglądać jak w przykładzie results.json. Gdy parametr debug_run jest włączony, raport podsumowania debugowania zwraca dane podobne do przykładu debug_results.json.

results.json (przykład)

Raporty AVRO pochodzące z usługi do agregacji mogą wyglądać podobnie, ponieważ zawierają klucz segmentu i wartość podsumowania lub agregacji z dodanym szumem wartości segmentu.

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

debug_results.json (przykład)

Raporty debugowania AVRO pochodzące z usługi do agregacji powinny wyglądać podobnie do poniższych. Zawierają klucze segmentów, unnoised_metric (podsumowanie kluczy segmentów bez szumu) i szum dodany do unnoised_metric.

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

Adnotacje będą też zawierać symbole in_reports lub in_domain, które oznaczają:

  • in_reports: klucz zasobnika jest dostępny w raportach zbiorczych.
  • in_domain: klucz zasobnika jest dostępny w pliku output_domain AVRO.