向 Google 跟踪代码管理器发送数据时出现 400 错误请求

400 Bad Request while sending data to Google Tag Manager

提问人:x89 提问时间:11/13/2023 更新时间:11/15/2023 访问量:49

问:

我已经按照本指南设置了 GTM 服务器端:https://aws-solutions-library-samples.github.io/advertising-marketing/using-google-tag-manager-for-server-side-website-analytics-on-aws.html

现在我有两个链接可以访问我的 GTM 服务器:

主服务器端容器 (analytics.example.com)

预览服务器容器 (preview-analytics.example.com)

我在aws_ecs_task_definition设置中使用了这些参数:

预览容器:

  container_definitions    = <<TASK_DEFINITION
  [
  {
    "name": "preview",
    "image": "gcr.io/cloud-tagging-10302018/gtm-cloud-image",
    "environment": [
      {
        "name": "PORT",
        "value": "80"
      },
      {
        "name": "RUN_AS_PREVIEW_SERVER",
        "value": "true"
      },
      {
        "name": "CONTAINER_CONFIG",
        "value": "${var.CONTAINER_CONFIG}"
      }
    ],

PrimaryContainer:

{
    "name": "primary",
    "image": "gcr.io/cloud-tagging-10302018/gtm-cloud-image",
    "environment": [
      {
        "name": "PORT",
        "value": "80"
      },
      {
        "name": "PREVIEW_SERVER_URL",
        "value": "${var.PREVIEW_SERVER_URL}"
      },
      {
        "name": "CONTAINER_CONFIG",
        "value": "${var.CONTAINER_CONFIG}"
      }
    ]

现在,我正在尝试使用 Snowbridge 将数据发送到 GTM,Snowbridge 使用 Ec2 实例上的 docker 容器运行。Snowbridge 从 Kinesis 数据流中读取数据并将其转发到 GTM。

https://docs.snowplow.io/docs/destinations/forwarding-events/snowbridge/configuration/targets/http/google-tag-manager/

配置.hcl.tmpl

source {
  use "kinesis" {
    stream_name = "${stream_name}"
    region      = "${region}"
    app_name    = "${app_name}"

    role_arn = "${role_arn}"
    read_throttle_delay_ms = 500

    # Maximum concurrent goroutines (lightweight threads) for message processing (default: 50)
    concurrent_writes = 50
  }
}

target {
  use "http" {
    url                        = "https://analytics.xx/com.snowplowanalytics.snowplow/enriched"
    request_timeout_in_seconds = 60
    content_type               = "application/json"

    # this line is optional, in case you want to send events to GTM Preview Mode
    headers                    = "{\"x-gtm-server-preview\": \"AAAAAAAXXXX==\"}"
  }
}

transform {
  use "spEnrichedToJson" {}
}

这按预期工作,我能够在预览模式下看到传入的数据。据我了解,数据仍在发送到原始模式,但在启用此选项时,它只是被转发到预览模式

删除可选标头(即 x-gtm-server-preview 参数)后,我在发送数据时会在 Cloudwatch 上收到错误:

level=warning msg="Retrying func (attempts: 2): target.Write: Error sending http requests: 1 error occurred:\n\t* Got response status: 400 Bad Request\n\n"

我还在此处将 PreviewContainer 的环境变量更改为 false:

 {
        "name": "RUN_AS_PREVIEW_SERVER",
        "value": "true"
 },

似乎我能够将数据发送到预览模式,但不能。可能的原因是什么?

错误是来自源 (snowbridge) 还是目标 (gtm)?

HTTP Amazon-ECS Google-Tag-Manager http-status-code-400 扫雪机

评论


答:

0赞 Simo Ahava 11/15/2023 #1

400 错误请求是 Google 跟踪代码管理器服务器应用在传入的 HTTP 请求没有“客户端”来声明该请求时生成的错误响应。

对服务器容器的每个 HTTP 请求都需要一个客户端来声明该请求,否则服务器容器将以 400 错误进行响应。

若要避免此错误,请确保服务器容器具有声明要发送到它的传入请求的客户端。

有关客户的更多信息:https://developers.google.com/tag-platform/tag-manager/server-side/intro#how_clients_work

评论

0赞 x89 11/15/2023
但是,如果没有客户端声明它,它为什么可以与预览模式一起使用呢?