@Nullable
    @Override
    public Message decode(@Nonnull RawMessage rawMessage) {
        final String msg = new String(rawMessage.getPayload(), charset);
        try (Timer.Context ignored = this.decodeTime.time()) {
            final ResolvableInetSocketAddress address = rawMessage.getRemoteAddress();
            final InetSocketAddress remoteAddress;
            if (address == null) {
                remoteAddress = null;
            } else {
                remoteAddress = address.getInetSocketAddress();
            }
            return parse(msg, remoteAddress == null ? null : remoteAddress.getAddress(), rawMessage.getTimestamp());
        }
    }
@Test
    public void testDecodeStructuredIssue845Empty() throws Exception {
        final Message message = codec.decode(buildRawMessage(STRUCTURED_ISSUE_845_EMPTY));

        assertNotNull(message);
        assertEquals("tralala", message.getMessage());
        assertEquals(new DateTime("2015-01-11T15:35:21.335797Z", DateTimeZone.UTC), ((DateTime) message.getField("timestamp")).withZone(DateTimeZone.UTC));
        assertEquals("s000000.example.com", message.getField("source"));
        assertEquals(0, message.getField("level"));
        assertEquals("local0", message.getField("facility"));
        assertEquals(16, message.getField("facility_num"));
    }