From d2b4b35e73986f2e70f9fe17b94a2e06e799e386 Mon Sep 17 00:00:00 2001 From: Sergey Kanzhelev Date: Wed, 2 Jan 2019 14:47:30 -0800 Subject: [PATCH] Event logging - docs and a single event example. (#85) * documents * first warning was implemented * first version of docs complete --- docs/error-handling.md | 41 +++++++ docs/error-logging.md | 103 ++++++++++++++++++ docs/event-source-listeners.png | Bin 0 -> 18244 bytes .../Implementation/OpenCensusEventSource.cs | 63 +++++++++++ .../Trace/Export/SpanExporterWorker.cs | 4 +- 5 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 docs/error-handling.md create mode 100644 docs/error-logging.md create mode 100644 docs/event-source-listeners.png create mode 100644 src/OpenCensus/Implementation/OpenCensusEventSource.cs diff --git a/docs/error-handling.md b/docs/error-handling.md new file mode 100644 index 0000000..c7c04ce --- /dev/null +++ b/docs/error-handling.md @@ -0,0 +1,41 @@ +# Error handling in Open Census C# SDK + +Open Census is a library that will in many cases run in a context of customer +app performing non-essential from app business logic perspective operations. +Open Census SDK also can and will often be enabled via platform extensibility +mechanisms and potentially only enabled in runtime. Which makes the use of SDK +non-obvious for the end user and sometimes outside of the end user control. + +This makes some unique requirements for Open Census error handling practices. + +## Basic error handling principles + +Open Census SDK must not throw or leak unhandled or user unhandled exceptions. + +1. APIs must not throw or leak unhandled or user unhandled exceptions when the + API is used incorrectly by the developer. Smart defaults should be used so + that the SDK generally works. +2. SDK must not throw or leak unhandled or user unhandled exceptions for + configuration errors. +3. SDK must not throw or leak unhandled or user unhandled exceptions for errors + in their own operations. Examples: telemetry cannot be sent because the + endpoint is down or location information is not available because device + owner has disabled it. + +## Guidance + +1. In .NET 4.0 and above, catching all exceptions will not catch corrupted + state exceptions (CSEs). + - We want this behavior—don’t catch CSEs + - This allows exceptions like stack overflow, access violation to flow through + - More information: http://msdn.microsoft.com/en-us/magazine/dd419661.aspx +2. Every background operation callback, Task or Thread method should have a + global `try{}catch` statement to ensure reliability of an app. +3. When catching all exceptions in other cases, reduce the scope of the `try` as + much as possible. +4. In general, don't catch, filter, and rethrow + - Catch all exceptions and log error + - If you must rethrow use `throw;` not `throw ex;`. It will ensure + original call stack is preserved. +5. Beware of any call to external callbacks or override-able interface. Expect + them to throw. \ No newline at end of file diff --git a/docs/error-logging.md b/docs/error-logging.md new file mode 100644 index 0000000..52f884d --- /dev/null +++ b/docs/error-logging.md @@ -0,0 +1,103 @@ +# Error logging + +This document explains how Open Census SDK logs information about it's own +execution. + +There are the following scenarios for SDK manageability: + +1. Send error & warning logs to the back-end for customer self-troubleshooting. +2. Visualize OC SDK health in external tools. +3. Visualize OC SDK health in Z-Pages. +4. Show errors/warnings/information in Visual Studio F5 debug window. +5. Testing – no debugger troubleshooting. +6. Customer support – collect verbose logs. + +## Definition of verbosity levels + +The following severity levels are defined for SDK logs. + +### Severity `Error` + +Problem in SDK operation resulted in data loss or inability to collect data. + +### Severity `Warning` + +Problem in SDK operation that MAY result in data loss if not attended to. +`Warning` level may also identify data quality problem. + +### Severity `Informational` + +Major, most often rarely happening operation completion. + +### Severity `Verbose` + +All other logs. Typically used for troubleshooting of a hard to reproduce +issues or issues happening in specific production environments. + +## Logging with EventSource + +1. Find or create an assembly-specific `internal` class inherited from + `EventSource`. +2. Prefix the name of EventSource with `OpenCensus-` using class attribute like + this: `[EventSource(Name = "OpenCensus-Base")]`. +3. Create a new `Event` method with the arguments that needs to be logged. Each + event should have index, message and event severity (level). It is a good + practice to include event severity (level) into the method name. +4. Use the following rules to pick event index: + 1. Do not reorder existing event method indexes. Otherwise versioning of + logs metadata will not work well. + 2. Do not put large gaps between indices. E.g. use sequential indices + instead of events categorization based on index (`1X` for one category, + `2X` for another). Unassigned indices in `1X` category will affect + logging performance. +5. Use the following rules to author the event message: + 1. Make event description actionable and explain the effect of the problem. + For instance, instead of *"No span in current context"* use something + like *"No span in current context. Span name will not be updated. It may + indicate incorrect usage of Open Census API - please ensure span wasn't + overridden explicitly in your code or by other module."* +6. Use the following definition of the severity from the next section. +7. Follow the performance optimization techniques. + +## Minimizing logging performance impact + +### Pass object references + +EventSource requires to use primitive types like `int` or `string` in `Write` +method. This limitation requires to format complex types like `Exception` before +calling trace statement. + +Since formatting happens before calling `Write` method it will be called +unconditionally – whether listener enabled or not. To minimize performance hit +create `NonEvent` methods in EventSource that accept complex types and check +`Log.IsEnabled` before serializing those and passing to `Event` methods. + +### Diagnostics events throttling + +Throttling is required for the following scenarios: + +- Minimize traffic we use to report problems to portal +- Make sure *.etl are not overloaded with similar errors + +Logs subscribers will implement throttling logic. However log producer may have +an additional logic to prevent excessive logging. For instance, if problem +cannot be resolved in runtime - producer of the `Error` log may decide to only +log it once or once in a while. Note, this technique should be used carefully +as not every log subscriber can be enabled from the process start and may miss +this important error message. + +## Subscribing to EventSource + +EventSource allows us to separate logic of tracing and delivering those traces +to different channels. Default ETW subscriber works out of the box. For all +other channels in-process subscribers can be used for data delivery. + +![event-source-listeners](event-source-listeners.png) + +## EventSource vs. using SDK itself + +1. No support for `IsEnabled` when exporter/listener exists. It's important for + verbose logging. +2. ETW channel is not supported. +3. In-process subscription/extensibility is not supported. +4. Logging should be more reliable then SDK itself. diff --git a/docs/event-source-listeners.png b/docs/event-source-listeners.png new file mode 100644 index 0000000000000000000000000000000000000000..a47a3f08bcab07999910af9c02ba544e18eec3c1 GIT binary patch literal 18244 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 literal 0 HcmV?d00001 diff --git a/src/OpenCensus/Implementation/OpenCensusEventSource.cs b/src/OpenCensus/Implementation/OpenCensusEventSource.cs new file mode 100644 index 0000000..871c061 --- /dev/null +++ b/src/OpenCensus/Implementation/OpenCensusEventSource.cs @@ -0,0 +1,63 @@ +// +// Copyright 2018, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +namespace OpenCensus.Implementation +{ + using System; + using System.Diagnostics.Tracing; + using System.Globalization; + using System.Threading; + + [EventSource(Name = "OpenCensus-Base")] + internal class OpenCensusEventSource : EventSource + { + public static readonly OpenCensusEventSource Log = new OpenCensusEventSource(); + + [NonEvent] + public void ExporterThrownExceptionWarning(Exception ex) + { + if (Log.IsEnabled(EventLevel.Warning, EventKeywords.All)) + { + this.ExporterThrownExceptionWarning(ToInvariantString(ex)); + } + } + + [Event(1, Message = "Exporter failed to export items. Exception: {0}", Level = EventLevel.Warning)] + public void ExporterThrownExceptionWarning(string ex) + { + this.WriteEvent(1, ex); + } + + /// + /// Returns a culture-independent string representation of the given object, + /// appropriate for diagnostics tracing. + /// + private static string ToInvariantString(Exception exception) + { + CultureInfo originalUICulture = Thread.CurrentThread.CurrentUICulture; + + try + { + Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; + return exception.ToString(); + } + finally + { + Thread.CurrentThread.CurrentUICulture = originalUICulture; + } + } + } +} diff --git a/src/OpenCensus/Trace/Export/SpanExporterWorker.cs b/src/OpenCensus/Trace/Export/SpanExporterWorker.cs index f586be9..5087cf8 100644 --- a/src/OpenCensus/Trace/Export/SpanExporterWorker.cs +++ b/src/OpenCensus/Trace/Export/SpanExporterWorker.cs @@ -20,6 +20,7 @@ namespace OpenCensus.Trace.Export using System.Collections.Concurrent; using System.Collections.Generic; using OpenCensus.Common; + using OpenCensus.Implementation; internal class SpanExporterWorker : IDisposable { @@ -139,8 +140,7 @@ private void Export(IEnumerable export) } catch (Exception ex) { - // TODO Log warning - Console.WriteLine(ex); + OpenCensusEventSource.Log.ExporterThrownExceptionWarning(ex); } } }