class GoogleCloudRun::ErrorReportingEntry

cloud.google.com/error-reporting/reference/rest/v1beta1/projects.events/report#ReportedErrorEvent cloud.google.com/error-reporting/docs/formatting-error-messages

Attributes

context_service[RW]
context_version[RW]
exception[RW]
labels[RW]
location_line[RW]
location_method[RW]
location_path[RW]
message[RW]
project_id[RW]
request[RW]
severity[RW]
timestamp[RW]
user[RW]

Public Class Methods

new() click to toggle source
# File lib/google_cloud_run/entry.rb, line 76
def initialize
  @severity = G_CRITICAL
  @timestamp = Time.now.utc
  @insert_id = SecureRandom.uuid
end

Public Instance Methods

to_json() click to toggle source
# File lib/google_cloud_run/entry.rb, line 82
def to_json
  raise "labels must be hash" if !@labels.blank? && !@labels.is_a?(Hash)

  j = {}

  j["@type"] = "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent"
  j["logging.googleapis.com/insertId"] = @insert_id
  j["severity"] = Severity.to_s(Severity.mapping(@severity))
  j["eventTime"] = @timestamp.strftime("%FT%T.%9NZ")
  j["logging.googleapis.com/labels"] = @labels unless @labels.blank?

  if @context_service || @context_version
    j["serviceContext"] = {}
    j["serviceContext"]["service"] = @context_service.to_s
    j["serviceContext"]["version"] = @context_version.to_s
  end

  if @request
    # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#httprequest
    j["httpRequest"] = {}
    j["httpRequest"]["requestMethod"] = @request&.method.to_s
    j["httpRequest"]["requestUrl"] = @request&.url.to_s
    j["httpRequest"]["userAgent"] = @request&.headers["user-agent"].to_s unless @request&.headers["user-agent"].blank?
    j["httpRequest"]["remoteIp"] = @request&.remote_ip.to_s
    j["httpRequest"]["referer"] = @request&.headers["referer"].to_s unless @request&.headers["referer"].blank?

    trace, span, sample = GoogleCloudRun.parse_trace_context(@request&.headers["X-Cloud-Trace-Context"])
    j["logging.googleapis.com/trace"] = "projects/#{@project_id}/traces/#{trace}" unless trace.blank?
    j["logging.googleapis.com/spanId"] = span unless span.blank?
    j["logging.googleapis.com/trace_sampled"] = sample unless sample.nil?
  end

  if @exception
    j["message"] = @exception.class.to_s

    e_message = @exception&.message.to_s.strip
    unless e_message.blank?
      j["message"] << ": " + e_message + "\n"
    end

    j["message"] << @exception&.backtrace.join("\n")
  else
    j["message"] = @message.is_a?(String) ? @message.strip : @message.inspect
  end

  j["context"] = {}

  if @request
    # https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#httprequest
    j["context"]["httpRequest"] = {}
    j["context"]["httpRequest"]["method"] = @request&.method
    j["context"]["httpRequest"]["url"] = @request&.url
    j["context"]["httpRequest"]["userAgent"] = @request&.headers["user-agent"] unless @request&.headers["user-agent"].blank?
    j["context"]["httpRequest"]["remoteIp"] = @request&.remote_ip
    j["context"]["httpRequest"]["referrer"] = @request&.headers["referer"] unless @request&.headers["referer"].blank?
  end

  if @user
    j["context"]["user"] = @user
  end

  if @location_path || @location_line || @location_method
    j["context"]["reportLocation"] = {}
    j["context"]["reportLocation"]["filePath"] = @location_path.to_s
    j["context"]["reportLocation"]["lineNumber"] = @location_line.to_i
    j["context"]["reportLocation"]["functionName"] = @location_method.to_s
  end

  j.to_json
end