public static void Main(string[] args) { var url = System.Environment.GetEnvironmentVariable("MONO_SENTRY_URL"); if (url == null) { Console.WriteLine("MONO_SENTRY_URL missing"); return; } var fileRoot = System.Environment.GetEnvironmentVariable("MONO_SENTRY_ROOT"); if (fileRoot == null) { Console.WriteLine("MONO_SENTRY_ROOT missing"); return; } var os_tag = System.Environment.GetEnvironmentVariable("MONO_SENTRY_OS"); if (os_tag == null) { Console.WriteLine("MONO_SENTRY_OS missing"); return; } var dsn = new Dsn(url); var files = GetFiles(fileRoot); if (files.Length == 0) { return; } // Find all of the assemblies in tree that could have made the crash dump var assemblies = GetAssemblies(fileRoot); var codebase = new CodeCollection(assemblies); foreach (var file in files) { Console.WriteLine($"Processing {file} ..."); var state = new Uploader(codebase); state.Upload(file, os_tag, dsn); } }
public void SendMessage(JObject sentry_message, Dsn url) { // Console.WriteLine ("Sending {0}", sentry_message.ToString ()); var request = (HttpWebRequest)WebRequest.Create(url.SentryUri); request.Method = "POST"; request.ContentType = "application/json"; request.UserAgent = "MonoSentryUploader/1.0.0.0"; var sentryVersion = 7; var time = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; var key = url.PrivateKey != null ? ", sentry_secret=" + url.PrivateKey : null; var header = String.Format("Sentry sentry_version={0}" + ", sentry_client={1}, sentry_timestamp={2}, sentry_key={3}{4}", sentryVersion, request.UserAgent, time, url.PublicKey, key); request.Headers ["X-Sentry-Auth"] = header; byte[] byteArray = Encoding.UTF8.GetBytes(sentry_message.ToString()); request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); try { WebResponse response = request.GetResponse(); // Display the status. // Console.WriteLine(((HttpWebResponse)response).StatusDescription); StreamReader reader = new StreamReader(response.GetResponseStream()); // Read the content. string responseFromServer = reader.ReadToEnd(); // Display the content. Console.WriteLine("\t-- HTTP POST Success {0}", responseFromServer); // Clean up the streams. } catch (WebException ex) { Console.WriteLine("\t-- HTTP POST Error:", ex.Response.Headers [""]); for (int i = 0; i < ex.Response.Headers.Count; i++) { Console.WriteLine("\t\t {0} : {1}", ex.Response.Headers.Keys [i], ex.Response.Headers [i]); } } }
public void Upload(string filePath, string os_tag, Dsn url) { if (!File.Exists(filePath)) { throw new Exception(String.Format("Json file not found {0}", filePath)); } var dump = File.ReadAllText(filePath); //var message = new SentryMessage(dump); // var blob = new SentryEvent(message); var payload = JObject.Parse(dump); // Try to extract a test name var fileName = Path.GetFileName(filePath); var extract = Regex.Match(fileName, @"mono_crash\.([A-Za-z0-9]+)\.(\d)\.json"); if (!extract.Success) { throw new Exception("File name does not match correct format"); } var groups = extract.Groups; var hash = groups[1].Value; // var increment = groups[2].Value; var version_string = payload["protocol_version"].ToString(); JObject sentry_message = null; if (version_string == "0.0.2") { sentry_message = Format_0_0_2(filePath, payload, hash); } else { Console.WriteLine("ERROR: Crash reporting version mismatch"); return; } // sent to url via post? // Console.WriteLine (sentry_message); SendMessage(sentry_message, url); }
public void Upload(string filePath, string os_tag, Dsn url) { if (!File.Exists(filePath)) { throw new Exception(String.Format("Json file not found {0}", filePath)); } var dump = File.ReadAllText(filePath); var message = new SentryMessage(dump); // var blob = new SentryEvent(message); var payload = JObject.Parse(dump); // Try to extract a test name var fileName = Path.GetFileName(filePath); var groups = Regex.Match(fileName, @"mono_crash.(\d+).(\d+).json").Groups; var hash = groups[1].Value; var increment = groups[2].Value; // var version_string = Regex.Match(payload["configuration"]["version"].ToString(), @"").Groups; var event_id = new JProperty("event_id", Guid.NewGuid().ToString("n")); var timestamp = new JProperty("timestamp", DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)); var exc_objs = new List <JObject> (); var failure_type = "Unhandled Managed Exception"; var stackTraces = payload["threads"] as JArray; if (stackTraces.Count > 1) { failure_type = "Unhandled Unmanaged Exception"; } var culprit = new JProperty("culprit", failure_type); for (int i = 0; i < stackTraces.Count; i++) { var thread_id = stackTraces[i]["native_thread_id"].ToString(); var managed_frame_name = ""; var unmanaged_frames = new List <JObject>(); var managed_frames = new List <JObject>(); var payload_unmanaged_frames = stackTraces[i]["managed_frames"] as JArray; for (int fr = 0; payload_unmanaged_frames != null && fr < payload_unmanaged_frames.Count; fr++) { var fn_filename = new JProperty("filename", "unknown"); var module = new JProperty("module", "mono-sgen"); var function = new JProperty("function", ""); unmanaged_frames.Add(new JObject(fn_filename, function, module)); } var payload_managed_frames = stackTraces[i]["managed_frames"] as JArray; for (int fr = 0; payload_managed_frames != null && fr < payload_managed_frames.Count; fr++) { var frame = payload_managed_frames [fr] as JObject; if (frame["is_managed"] != null && frame["is_managed"].ToString() == "true") { var guid_val = frame["guid"].ToString(); var token_val = Convert.ToUInt32(frame["token"].ToString(), 16); var offset_val = Convert.ToUInt32(frame["il_offset"].ToString(), 16); var output_frame = codebase.Find(guid_val, token_val, offset_val); if (output_frame == null) { continue; } var guid = new JProperty("guid", guid_val); var token = new JProperty("token", token_val); var il_offset = new JProperty("il_offset", offset_val); output_frame.Add(new JProperty("vars", new JObject(guid, token, il_offset))); managed_frames.Add(output_frame); } else { var native_address = frame["native_address"].ToString(); var unmanaged_name = frame["unmanaged_name"].ToString(); var fn_filename = new JProperty("filename", "native"); var function = new JProperty("function", string.Format("Offset {0}", unmanaged_name)); var module = new JProperty("module", unmanaged_name); var vars = new JProperty("vars", frame); managed_frames.Add(new JObject(fn_filename, function, module)); } } if (managed_frames.Count > 0) { var managed_st = new JObject(new JProperty("frames", new JArray(managed_frames.ToArray()))); exc_objs.Add(new JObject( new JProperty("module", String.Format("{0}_managed_frames", thread_id)), new JProperty("type", failure_type), new JProperty("value", managed_frame_name), new JProperty("stacktrace", managed_st))); } if (unmanaged_frames.Count > 0) { var unmanaged_st = new JObject(new JProperty("frames", new JArray(unmanaged_frames.ToArray()))); exc_objs.Add(new JObject( new JProperty("module", String.Format("{0}_unmanaged_frames", thread_id)), new JProperty("type", failure_type), new JProperty("value", managed_frame_name), new JProperty("stacktrace", unmanaged_st))); } } var exception = new JProperty("exception", new JArray(exc_objs.ToArray())); // Bake in the whole blob var embedded = new JProperty("extra", payload); var sentry_message = new JObject(timestamp, event_id, culprit, exception, embedded); // sent to url via post? Console.WriteLine(sentry_message); var request = (HttpWebRequest)WebRequest.Create(url.SentryUri); request.Method = "POST"; request.ContentType = "application/json"; request.UserAgent = PacketBuilder.UserAgent; var header = PacketBuilder.CreateAuthenticationHeader(url); request.Headers ["X-Sentry-Auth"] = header; byte[] byteArray = Encoding.UTF8.GetBytes(sentry_message.ToString()); request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); Console.WriteLine("break"); try { WebResponse response = request.GetResponse(); // Display the status. Console.WriteLine(((HttpWebResponse)response).StatusDescription); StreamReader reader = new StreamReader(response.GetResponseStream()); // Read the content. string responseFromServer = reader.ReadToEnd(); // Display the content. Console.WriteLine(responseFromServer); // Clean up the streams. } catch (WebException ex) { Console.WriteLine("{0}", ex.Response.Headers [""]); } }