public void ReadEvents(DateTime startTime, DateTime endTime) { if (startTime > endTime) { throw new ArgumentException(StringResources.ETLReaderError_StartTimeGreaterThanEndTime, "startTime"); } if (this.EventRead == null) { throw new InvalidOperationException(StringResources.ETLReaderError_NoSubscribersForEventRead); } // initialize trace handle InitializeTraceHandle(); ulong eventReadFailureCount; LttngReaderStatusCode res = ProcessTrace(startTime, endTime, ref this.traceHandle, out eventReadFailureCount); if (res != LttngReaderStatusCode.SUCCESS && res != LttngReaderStatusCode.END_OF_TRACE) { string errorMessage = LttngReaderStatusMessage.GetMessage(res); throw new InvalidDataException( $"{errorMessage}. When processing traces at folder: {this.path}.\n" + $"Last event successfully read has timestamp: {LttngTraceFolderEventReader.ConvertFromUnixEpoch(this.lastEventReadTimestamp).ToString("o")}\n" + $"Total events events skipped due to failure before exception : {eventReadFailureCount}"); } if (eventReadFailureCount != 0) { throw new InvalidDataException( $"Failed to read {eventReadFailureCount} events from trace at {this.path}" + $"StartTime: {startTime}, EndTime: {endTime}"); } }
public LttngTraceFolderEventReader(string path) { if (!Directory.Exists(path)) { throw new DirectoryNotFoundException($"LTTng trace folder not found at: {path}"); } this.path = path; LttngTraceFolderEventReader.clearLTTngTraceHandle(ref this.traceHandle); }
public TraceSessionMetadata ReadTraceSessionMetadata() { // initialize trace handle InitializeTraceHandle(); // This is an approximation based on the naming of the file. var traceSessionName = Path.GetFileName(this.path).Split('_')[0]; var eventsLost = (this.TestEventsLost > 0) ? (this.TestEventsLost) : (this.EventsLost); var sessionStartTime = LttngTraceFolderEventReader.ConvertFromUnixEpoch(this.traceHandle.trace_info.start_time); var sessionEndTime = LttngTraceFolderEventReader.ConvertFromUnixEpoch(this.traceHandle.trace_info.end_time); var traceSessionMetadata = new TraceSessionMetadata(traceSessionName, eventsLost, sessionStartTime, sessionEndTime); return(traceSessionMetadata); }
private LttngReaderStatusCode ProcessTrace(DateTime startTime, DateTime endTime, ref LTTngTraceHandle traceHandle, out ulong eventReadFailureCount) { EventRecord eventRecord = new EventRecord(); ulong lastReadTimestamp = 0; // needed for processing unstructured events in Linux bool isUnstructured = false; StringBuilder unstructuredRecord = new StringBuilder(LttngReaderBindings.MAX_LTTNG_UNSTRUCTURED_EVENT_LEN + 1); StringBuilder taskNameEventName = new StringBuilder(LttngReaderBindings.MAX_LTTNG_TASK_EVENT_NAME_LEN + 1); ulong startTimeEpochNanoS = LttngTraceFolderEventReader.ConvertToUnixEpoch(startTime); ulong endTimeEpochNanoS = LttngTraceFolderEventReader.ConvertToUnixEpoch(endTime); // set start and end time for reading traces LttngReaderStatusCode res = LttngReaderBindings.set_start_end_time(ref traceHandle, startTimeEpochNanoS, endTimeEpochNanoS); eventReadFailureCount = 0; if (res != LttngReaderStatusCode.SUCCESS) { return(res); } res = LttngReaderBindings.read_next_event(ref traceHandle, ref eventRecord, unstructuredRecord, taskNameEventName, ref lastReadTimestamp, ref isUnstructured); while (res == LttngReaderStatusCode.SUCCESS || res == LttngReaderStatusCode.FAILED_TO_READ_EVENT) { if (res == LttngReaderStatusCode.FAILED_TO_READ_EVENT) { eventReadFailureCount++; continue; } EventRecordEventArgs eventRecordEventArgs; this.lastEventReadTimestamp = lastReadTimestamp; if (isUnstructured) { try { eventRecord.EventHeader.TimeStamp = LttngTraceFolderEventReader.ConvertFromUnixEpoch(lastReadTimestamp).ToFileTimeUtc(); } catch (Exception) { // Flagging error with minimum timestamp so we can continue processing other events. eventRecord.EventHeader.TimeStamp = 0; } eventRecordEventArgs = new EventRecordEventArgs(eventRecord); eventRecordEventArgs.IsUnstructured = isUnstructured; eventRecordEventArgs.TaskNameEventName = taskNameEventName.ToString(); eventRecordEventArgs.UnstructuredRecord = unstructuredRecord.ToString(); } else { eventRecordEventArgs = new EventRecordEventArgs(eventRecord); } this.EventRead(this, eventRecordEventArgs); if (eventRecordEventArgs.Cancel) { return(LttngReaderStatusCode.SUCCESS); } res = LttngReaderBindings.read_next_event(ref traceHandle, ref eventRecord, unstructuredRecord, taskNameEventName, ref lastReadTimestamp, ref isUnstructured); } return(res); }