【问题标题】:Stackdriver error reporting with gcloud使用 gcloud 报告 Stackdriver 错误
【发布时间】:2018-02-27 16:11:41
【问题描述】:

我正在重新使用 gcloud cli 将事件发送到 StackDriver 错误报告。
(非常有限的)文档在这里:https://cloud.google.com/sdk/gcloud/reference/beta/error-reporting/events/report

无论我发送什么消息,我似乎都会收到此错误:

错误:(gcloud.beta.error-reporting.events.report) INVALID_ARGUMENT:ReportedErrorEvent.context 必须包含位置,除非 message 包含异常或堆栈跟踪。

我尝试将消息格式化为错误报告的 JSON 表示形式:https://cloud.google.com/error-reporting/docs/formatting-error-messages 但信息似乎是一样的。这是一个示例命令和 JSON:

gcloud beta error-reporting events report --service foo --message-file err.json

{
    "serviceContext": {
        "service": "foo"
    },
    "message": "Whoops!",
    "context": {
        "reportLocation": {
            "filePath": "/usr/local/bin/test",
            "lineNumber": 123,
            "functionName": "main"
        }
    }
}

【问题讨论】:

    标签: google-cloud-platform gcloud stackdriver google-cloud-stackdriver google-cloud-error-reporting


    【解决方案1】:

    尝试在上下文中添加 httpRequest 详细信息。

    您可以在文档中找到 json 有效负载的详细信息。 json中的父对象为ErrorEvent

    您可以从那里开始并找到指向其子元素 ServiceContextErrorContext 的链接

    虽然我没有尝试过命令行选项,但我调试了我们在应用程序中使用的堆栈驱动程序日志记录类,以找出我们正在发送的 json 有效负载,这是从我们的应用程序触发的示例 json。

    {
      "context": {
        "httpRequest": {
          "responseStatusCode": 500,
          "method": "GET",
          "url": "http://localhost:16500/product"
        },
        "user": "2247177"
      },
      "message": "org.springframework.web.client.HttpServerErrorException:  500 Server Error
      at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java: 94)
      ",
      "serviceContext": {
        "service": "cart",
        "version": ""
      }

    【讨论】:

      【解决方案2】:

      gcloud --message 或 --message-field 参数只是报告错误的 message 字段,而不是整个 JSON。由于您无法通过 gcloud 提供 reportLocation,因此 message 必须是堆栈跟踪或异常。

      API explorer 与原始请求一起使用。记录错误也会通过以下方式进入错误报告:

      gcloud beta logging write --payload-type=json test-errors-log '
      {
          "serviceContext": {
              "service": "foo"
          },                        
          "message": "Whoops!",
          "context": {
              "reportLocation": {
                  "filePath": "/usr/local/bin/test",
                  "lineNumber": 123,
                  "functionName": "main"
              }
          }
      }'
      

      【讨论】:

        【解决方案3】:

        另一种方式。

        gcloud logging write --payload-type=json test-errors-log '
        {
          "serviceContext": {"service": "foo"},                        
          "message": "message with stacktrace\n at /test.js"
        }
        '
        
        gcloud logging write --payload-type=json test-errors-log '
        {
          "@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
          "message": "message without stacktrace"
        }
        '
        
        gcloud beta error-reporting events report --service foo --message 'message with stacktrace
        at /test.js'
        

        【讨论】:

        • 虽然这可行,但最好能解释一下为什么会这样。特别是,因为对于 gcloud,您使用了一个技巧:通过在换行后的消息中指定“at /test.js”,您可以使用任何消息。即使没有“真正的”堆栈跟踪。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 2018-09-11
        • 2019-05-29
        相关资源
        最近更新 更多