[Spice-devel,spice-server,2/3] spicevmc: Add some statistics

Submitted by Frediano Ziglio on Dec. 6, 2016, 12:55 p.m.

Details

Message ID 20161206125508.16715-2-fziglio@redhat.com
State Superseded
Headers show
Series "Series without cover letter" ( rev: 1 ) in Spice

Not browsing as part of any series.

Commit Message

Frediano Ziglio Dec. 6, 2016, 12:55 p.m.
Allows to see compressed/uncompressed ratio

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
---
 server/spicevmc.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

Patch hide | download patch | download mbox

diff --git a/server/spicevmc.c b/server/spicevmc.c
index 039a50a..8313db6 100644
--- a/server/spicevmc.c
+++ b/server/spicevmc.c
@@ -114,6 +114,8 @@  struct RedVmcChannel
     RedVmcPipeItem *pipe_item;
     RedCharDeviceWriteBuffer *recv_from_client_buf;
     uint8_t port_opened;
+    RedStatCounter in_data, in_compressed, in_decompressed;
+    RedStatCounter out_data, out_compressed, out_uncompressed;
 };
 
 struct RedVmcChannelClass
@@ -194,6 +196,15 @@  red_vmc_channel_constructed(GObject *object)
     client_cbs.connect = spicevmc_connect;
     red_channel_register_client_cbs(RED_CHANNEL(self), &client_cbs, NULL);
 
+    red_channel_init_stat_node(RED_CHANNEL(self), NULL, "spicevmc");
+    const RedStatNode *stat = red_channel_get_stat_node(RED_CHANNEL(self));
+    stat_init_counter(&self->in_data, reds, stat, "in_data", TRUE);
+    stat_init_counter(&self->in_compressed, reds, stat, "in_compressed", TRUE);
+    stat_init_counter(&self->in_decompressed, reds, stat, "in_decompressed", TRUE);
+    stat_init_counter(&self->out_data, reds, stat, "out_data", TRUE);
+    stat_init_counter(&self->out_compressed, reds, stat, "out_compressed", TRUE);
+    stat_init_counter(&self->out_uncompressed, reds, stat, "out_uncompressed", TRUE);
+
 #ifdef USE_LZ4
     red_channel_set_cap(RED_CHANNEL(self), SPICE_SPICEVMC_CAP_DATA_COMPRESS_LZ4);
 #endif
@@ -305,6 +316,8 @@  static RedVmcPipeItem* try_compress_lz4(RedVmcChannel *channel, int n, RedVmcPip
                                                  BUF_SIZE);
 
     if (compressed_data_count > 0 && compressed_data_count < n) {
+        stat_inc_counter(channel->out_uncompressed, n);
+        stat_inc_counter(channel->out_compressed, compressed_data_count);
         msg_item_compressed->type = SPICE_DATA_COMPRESSION_TYPE_LZ4;
         msg_item_compressed->uncompressed_data_size = n;
         msg_item_compressed->buf_used = compressed_data_count;
@@ -355,6 +368,7 @@  static RedPipeItem *spicevmc_chardev_read_msg_from_dev(RedCharDevice *self,
             return &msg_item_compressed->base;
         }
 #endif
+        stat_inc_counter(channel->out_data, n);
         msg_item->uncompressed_data_size = n;
         msg_item->buf_used = n;
         return &msg_item->base;
@@ -524,6 +538,8 @@  static int handle_compressed_msg(RedVmcChannel *channel, RedChannelClient *rcc,
                                                  (char *)decompressed,
                                                  compressed_data_msg->compressed_size,
                                                  compressed_data_msg->uncompressed_size);
+        stat_inc_counter(channel->in_compressed, compressed_data_msg->compressed_size);
+        stat_inc_counter(channel->in_decompressed, decompressed_size);
         break;
     }
 #endif
@@ -558,6 +574,7 @@  static int spicevmc_red_channel_client_handle_message_parsed(RedChannelClient *r
     switch (type) {
     case SPICE_MSGC_SPICEVMC_DATA:
         spice_assert(channel->recv_from_client_buf->buf == msg);
+        stat_inc_counter(channel->in_data, size);
         channel->recv_from_client_buf->buf_used = size;
         red_char_device_write_buffer_add(channel->chardev, channel->recv_from_client_buf);
         channel->recv_from_client_buf = NULL;