private (string name, string data) GetMessage(AuditDataEvent @event) { var attribute = @event.GetType().GetCustomAttribute <EventAttribute>(); if (attribute == null) { throw new ArgumentException($"{nameof(EventAttribute)} missing on {nameof(@event)}"); } if (string.IsNullOrEmpty(attribute.Name)) { throw new ArgumentNullException( $"{nameof(EventAttribute)}.Name missing on {nameof(@event)}"); } var serializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var message = new RabbitMqMessage { Name = attribute.Name, EventData = JsonConvert.SerializeObject(@event, serializerSettings) }; return(attribute.Name, JsonConvert.SerializeObject(message, serializerSettings)); }
public void SendMessage(AuditDataEvent @event) { (string name, string data)message = GetMessage(@event); var shouldDispose = tracer.CurrentTransaction == null; var transaction = shouldDispose ? tracer.StartTransaction($"{message.name}", "event-publisher") : tracer.CurrentTransaction; try { var factory = new ConnectionFactory() { HostName = _rabbitMqConfig.Value.Hostname, UserName = _rabbitMqConfig.Value.UserName, Password = _rabbitMqConfig.Value.Password }; var span = transaction.StartSpan($"Send message to exchange {_rabbitMqConfig.Value.Exchange}", "rabbitmq", subType: ApiConstants.TypeExternal); span.SetLabel("Message name", message.name); span.SetLabel("Message content", message.data); using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.ExchangeDeclare(exchange: _rabbitMqConfig.Value.Exchange, type: ExchangeType.Fanout, durable: false, autoDelete: false, arguments: null); var json = message.data; var body = Encoding.UTF8.GetBytes(json); channel.BasicPublish(exchange: _rabbitMqConfig.Value.Exchange, routingKey: "netcoremicroservices-key", basicProperties: null, body: body); } span?.End(); var logData = new { Type = "EventProducer", Event = message.name, Data = @event }; _logger.LogInformation("Type: {type}, event send {event} on topic {topic} : {data}", "EventProducer", message.name, _rabbitMqConfig.Value.Exchange, JObject.FromObject(logData).ToString()); } catch (Exception e) { transaction.CaptureException(e); _logger.LogError(e.Message); } if (shouldDispose) { transaction.End(); } }