/// <summary> /// This is the main method that write the messages to the trace. /// All derived classes must use this method to write to the provider log. /// </summary> /// <param name="ed">EventDescriptor</param> /// <param name="payload">payload</param> protected void WriteEvent(EventDescriptor ed, params object[] payload) { EventProvider provider = GetProvider(); if (!provider.IsEnabled()) { return; } if (payload != null) { for (int i = 0; i < payload.Length; i++) { if (payload[i] == null) { payload[i] = string.Empty; } } } bool success = provider.WriteEvent(ref ed, payload); if (EventWritten != null) { EventWritten.Invoke(this, new EtwEventArgs(ed, success, payload)); } }
/// <summary> /// Write to the Event Stream /// </summary> /// <remarks> /// If the event stream doesn't exist, create it. /// The data in the event parameter includes the original stream, the recorded event, and messageId. /// <seealso cref="EventWritten"/> /// Generate the name from the event type passed in the original stream. <see cref="GetOrCreateEventTypeStream"/> /// The caller sets up the Event Stream, append the events."/> /// </remarks> /// <param name="event">Event to be written to the event stream</param> private void WriteToByEventProjection(EventWritten @event) { if (!_connected || _disposed) { throw new Exception(); } if (@event.ProjectedEvent) { return; } var stream = GetOrCreateEventTypeStream(@event, out var streamName); var epochStart = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); var created = DateTime.UtcNow; var epochTime = (long)(created - epochStart).TotalSeconds; var projectedEvent = new ProjectedEvent( streamName, @event.Event.EventNumber, @event.Event.EventStreamId, @event.Event.EventId, // reusing since the projection is linking to the original event stream.Count, @event.Event.EventType, @event.Event.Data, @event.Event.Metadata, @event.Event.IsJson, created, epochTime); stream.Add(projectedEvent); All.Add(projectedEvent); _inboundEventHandler.Handle(new EventWritten(streamName, projectedEvent, true, projectedEvent.EventNumber)); }
/// <summary> /// Get or Create the By-Category projection Stream for Category /// </summary> /// <remarks> /// <see href="https://eventstore.org/docs/projections/system-projections/index.html"/> /// The category stream name is generated by spiting the event stream at the first dash. This is the default /// configuration setting (prefix (a category) by splitting a stream id by a configurable separator.) /// </remarks> /// <param name="event">Original event whose name is in the aggregate-GUID format</param> /// <param name="streamName">the generated name for the stream</param> /// <returns>categoryStreamName: string</returns> private List <RecordedEvent> GetOrCreateCategoryStream(EventWritten @event, out string streamName) { var category = @event.StreamName.Split('-')[0]; streamName = $"{CategoryStreamNamePrefix}-{category}"; return(GetOrCreateStream(streamName)); }
/// <summary> /// Increases the number of messages. /// </summary> /// <param name="logEvent">The logging event.</param> protected override void Write(LogEventInfo logEvent) { if (BeforeWrite != null) { BeforeWrite.Invoke(null, null, Thread.CurrentThread.ManagedThreadId); } if (EventWritten != null) { var rendered = Layout == null ? null : Layout.Render(logEvent); EventWritten.Invoke(logEvent, rendered, Thread.CurrentThread.ManagedThreadId); } }
/// <summary> /// Get or Create the EventType Projection Stream for Event Type /// </summary> /// <remarks> /// <see href="https://eventstore.org/docs/projections/system-projections/index.html"/> /// The event stream name is generated from the event type. In the event store, this is not configurable. /// </remarks> /// <param name="event">Original event whose name is in the aggregate-GUID format</param> /// <param name="streamName">the generated name for the stream</param> /// <returns>eventStreamName: string</returns> private List <RecordedEvent> GetOrCreateEventTypeStream(EventWritten @event, out string streamName) { streamName = $"{EventTypeStreamNamePrefix}-{@event.Event.EventType}"; return(GetOrCreateStream(streamName)); }