// this method shows an example of how EventData.Body can be deserialized into multiple records. protected override IEnumerable <EventHubRecord> DeserializeEventData(EventDataFromCapture eventData) { // assumes EventData.Body is a gzipped line separated records. using (var stream = new MemoryStream(eventData.Body)) { try { // deserialize body from a single eventdata completely. Skip eventData message body with invalid format. using (var unzippedStream = new GZipStream(stream, CompressionMode.Decompress)) { return(this.contentDeserializer .Deserialize(unzippedStream) .Select( payload => new EventHubRecord() { Offset = eventData.Offset, Payload = payload }) .ToArray()); } } catch (Exception e) { var shortErrorMessage = $"Error deserializing eventhub message with offset: {eventData.Offset} SequenceNumber:{eventData.SequenceNumber}"; this.diagnostics.WriteError( shortErrorMessage, $"{shortErrorMessage} Exception: {e}"); return(Enumerable.Empty <EventHubRecord>()); } } }
public override IEnumerable <T> Deserialize(Stream stream) { IFileReader <GenericRecord> reader = null; try { reader = DataFileReader <GenericRecord> .OpenReader(stream); } catch (Exception e) { this.diagnostics.WriteError( briefMessage: "Unable to open stream as avro. Please check if the stream is from eventhub capture. https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-capture-overview ", detailedMessage: e.Message); throw; } foreach (GenericRecord genericRecord in reader.NextEntries) { EventDataFromCapture eventData = this.ConvertToEventDataFromCapture(genericRecord); // deserialize records from eventdata body. foreach (T record in this.DeserializeEventData(eventData)) { yield return(record); } } reader.Dispose(); }
private EventDataFromCapture ConvertToEventDataFromCapture(GenericRecord genericRecord) { try { var eventData = new EventDataFromCapture() { EnqueuedTimeUtc = (string)genericRecord["EnqueuedTimeUtc"], Offset = (string)genericRecord["Offset"], SequenceNumber = (long)genericRecord["SequenceNumber"], Body = (byte[])genericRecord["Body"], }; return(eventData); } catch (Exception e) { this.diagnostics.WriteError( briefMessage: $"Unable to get fields required to create captured event data. Error: {e.Message}", detailedMessage: e.ToString()); throw; } }
protected abstract IEnumerable <T> DeserializeEventData(EventDataFromCapture eventData);